내가이 기사에서 수집 한 것으로부터, 익명의 유형을 생성하고 있으며이를 사용하여 값을 얻습니다. 이 경우 해당 객체에 메소드를 추가하는 쉬운 방법은 없습니다. 그러나 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.
}
}
당신은 가능성이 가장 높은 얻을 수 있도록 저장 방법에 반사를 사용하여 필요한 모든 속성은 동적으로 생성 되었기 때문에 속성을 사용합니다.
는 내가 얻을 "XML 구조가 같은 모든 시간이 될 것입니다 경우 SP는 실행"RFW 3456<인스턴스> BRD 1245 인스턴스 이름> 프로젝트의 이름! 기타 다른 속성을 사용할 때마다 :( –
예,하지만 선택할 수있는 속성 목록이 있습니다. 해당 속성을 Nullable 필드로 채 웁니다 (값 유형 인 경우). 그리고 당신이 다시 얻을 것들을 채 웁니다. 난 당신이 동적으로 유형을 구축하는 몇 가지 미친 솔루션을 사용해야 할 것 같아요 ... – BFree
XML은 동적으로 생성되며 구체적인 클래스의 라이브러리를 유지하고 싶지 않아요 –