2009-04-02 5 views
7

효과적으로 XML을 저장 프로 시저에 전달하는 사내 데이터 액세스 라이브러리를 사용하여 XML을 반환합니다. 이것에 대해 제가 할 수있는 일은 없습니다. ActiveRecord를 승인하려고 시도했지만 요청이 거부되었습니다. 그러나 http://blog.bodurov.com/Post.aspx?postID=27에서 제공되는 훌륭한 코드를 사용하여, 난 불규칙한 XML로 만든 키 - 값 쌍을 강력한 형식의 개체로 다시 변환하고 속성 이름을 완성하는 IEnumerable에 확장 메서드를 추가했습니다!런타임에 동적으로 생성 된 C# 유형에 메서드를 연결하려면 어떻게해야합니까?

이 :

dict["keyName1"] 

MyObject.keyName1 

지금 인터페이스가 데이터 바인딩을 지원하게된다! 정말 멋진! 그래도 한 걸음 더 나아가고 싶습니다. 나는 방출 된 객체가 Save() 메소드를 갖기를 원하기 때문에 ActiveRecord 패턴을 원하고 ASP.net에서 사용할 직관적 인 객체 레이어를 웹 사용자에게 제공 할 수 있습니다.

Visual Studio에서 소스 코드로 메서드를 작성하고 런타임에 방사 된 개체에 연결하려면 어떻게해야합니까? 나는 어셈블리 또는 일리노이에 관심이 없다. C#에서 이것을하고 싶습니다. 이것은 내 첫 번째 StackOverflow 질문이며 회사에서 위임받은 IE6으로 게시하고 있으므로 부드럽게 작성하십시오.

답변

2

내가이 기사에서 수집 한 것으로부터, 익명의 유형을 생성하고 있으며이를 사용하여 값을 얻습니다. 이 경우 해당 객체에 메소드를 추가하는 쉬운 방법은 없습니다. 그러나 SP가 실행될 때마다 XML 구조가 동일하면 필요한 모든 속성을 가진 구체적인 클래스를 만들고 XML 객체로 컬렉션을 채 웁니다. 그런 식으로, 당신은 쉽게 당신이 클래스에 직접 필요한 모든 방법을 ... 추가 할 수 있습니다

편집 : 당신이 구축 할 때, 거기에 코드에서

: 코멘트에 우리의 논의를 바탕으로, 여기에 생각입니다 형식을 사용하면 ModuleBuilder.DefineType이 사용됩니다. 연장 할 타입을 취하는 DefineType에 과부하가 있습니다. Link.. 따라서 인터페이스를 만들면 (이벤트에 메서드가 없어야 함) 동적으로 유형을 구축 할 때 내가 연결 한 오버로드를 사용하여 인터페이스를 확장합니다. 그런 다음 해당 인터페이스에서 Save()를 수행하는 확장 메서드를 만듭니다.

http://msdn.microsoft.com/en-us/library/f53tx4x8.aspx

EDIT2 :

다른 확장하는 형식을 취 관심을 가질 수있는 과부하 및 인터페이스있다 코드 샘플 :

첫째, 인터페이스를 만들 :

public interface ISaveExtentable //I suck at naming stuff :-p 
{ 

} 

그런 다음 해당 사이트에서 좋아하는 코드에 GetTypeBuilder라는 메서드가 있습니다. 이 그것을 변경 : 어떻게 그 인터페이스에 확장 방법을, 그리고

 private static TypeBuilder GetTypeBuilder(string typeSigniture) 
     { 
      AssemblyName an = new AssemblyName("TempAssembly" + typeSigniture); 
      AssemblyBuilder assemblyBuilder = 
       AppDomain.CurrentDomain.DefineDynamicAssembly(
        an, AssemblyBuilderAccess.Run); 
      ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule("MainModule"); 

      TypeBuilder tb = moduleBuilder.DefineType("TempType" + typeSigniture 
           , TypeAttributes.Public | 
           TypeAttributes.Class | 
           TypeAttributes.AutoClass | 
           TypeAttributes.AnsiClass | 
           TypeAttributes.BeforeFieldInit | 
           TypeAttributes.AutoLayout 
           , typeof(object), new Type[] {typeof(ISaveExtentable)}); 
      return tb; 
     } 

를 만들 저장 :

public static class SaveExtendableExtensions 
    { 
      public static void Save(this ISaveExtentable ise) 
      { 
       //implement save functionality. 
      } 
    } 

당신은 가능성이 가장 높은 얻을 수 있도록 저장 방법에 반사를 사용하여 필요한 모든 속성은 동적으로 생성 되었기 때문에 속성을 사용합니다.

+0

는 내가 얻을 "XML 구조가 같은 모든 시간이 될 것입니다 경우 SP는 실행"RFW 3456 <인스턴스> BRD 1245 프로젝트의 이름! 기타 다른 속성을 사용할 때마다 :( –

+0

예,하지만 선택할 수있는 속성 목록이 있습니다. 해당 속성을 Nullable 필드로 채 웁니다 (값 유형 인 경우). 그리고 당신이 다시 얻을 것들을 채 웁니다. 난 당신이 동적으로 유형을 구축하는 몇 가지 미친 솔루션을 사용해야 할 것 같아요 ... – BFree

+0

XML은 동적으로 생성되며 구체적인 클래스의 라이브러리를 유지하고 싶지 않아요 –

1

나는 이것이 직접 또는 쉽게 .net에서 사용할 수없는 혼합 인이라고 생각합니다. 그러나 이것이 이해되면서 이것이 LinFu 프레임 워크가 설계된 주요 이유 중 하나입니다.

관련 문제