2011-03-25 3 views
0

다음은 클래스 개체에서 속성 값을 가져 오는 내 메서드입니다. 클래스 이름을 String으로 전달하여 클래스를 인스턴스화하면 어떻게 동일한 결과를 얻을 수 있습니까? 인스턴스화 후 같은 페이지에서 사용할 수있는 'LoadFromXmlData()'메서드를 사용하려고합니다. 이 작업을 수행 할 수 있습니까?리플렉션을 사용하여 클래스 인스턴스화 및 메서드 호출

private string GetPropertyValue(string propName, string className) 
    { 
     Class1 _Class1; 
     Class2 _Class2; 
     Class3 _Class3; 

     if (className.Equals("Class1")) 
     { 

     _Class1 = new Class1(); 
     _Class1 = (Class1)Class1.LoadFromXmlData(typeof(Class1), myData.ToString()); 

      return _Class1.GetType().GetProperty(propName).GetValue(_Class1, null).ToString(); 
     } 
     else if (ActionClassName.Equals("TicketActionDef")) 
     { 
     _Class2 = new Class2(); 
     _Class2 = (Class2)Class2.LoadFromXmlData(typeof(Class2), myData.ToString()); 

     return __Class2.GetType().GetProperty(propName).GetValue(_Class2, null).ToString(); 
     } 
     else 
     { 
     _Class3 = new Class3(); 
     _Class3 = (Class1)Class1.LoadFromXmlData(typeof(Class3), myData.ToString()); 

     return __Class3.GetType().GetProperty(propName).GetValue(_Class3, null).ToString(); 

     } 

    } 

다음과 같이 DLL을로드합니다. 이 후에 어떻게해야합니까? 제발 도와주세요, 나는 매우 새로워졌습니다.

Type.GetType("Namespace.Class1").GetConstructor(new Type[] {}).Invoke(null); 

"Namespace.Class1 :

Assembly assembly = Assembly.GetAssembly(typeof(MyAdapter)); 
MyAdapter currentEventObject = (MyAdapter)assembly.CreateInstance(className); 

감사

+1

왜 이런 끔찍한 명명 스타일? 그것은 코드를 읽을 수 없게 만듭니다. –

+0

이름 지정 스타일에 불편을 끼쳐 드려 죄송합니다. 그 밖의 조건이라면 내 실제 기능은 훨씬 더 커집니다. 방금 달성하려고하는 일부 샘플 함수를 게시했습니다 – San

+0

명명 스타일은 꽤 일반적이지만 달성하려는 것은 무엇입니까? 나는 왜 당신이 성찰을 사용하는지 알지 못한다. 큰 if/else 조건을 처리해야하는 경우 문제에 대한 더 나은 해결책을 찾아야합니다. – Zebi

답변

4

나는 당신이 달성하려고하는지의 전체 범위를 이해하지만 명명 된 클래스의 인스턴스를하기 위해 100 % 확실하지 않다 (정규화 된 이름을 포함해야합니다을, fullNamespace.className) 당신이 이런 식으로 작업을 수행 할 수 있습니다 그것에 방법 및 속성을 호출 :

private static string GetPropertyValue(Assembly assembly, string className, 
     string propertyName) 
    { 
     object instance = assembly.CreateInstance(className); 
     Type classType = instance.GetType(); 
     MethodInfo method = classType.GetMethod("LoadFromXmlData"); 
     method.Invoke(instance, new object[] { classType, myData }); 
     PropertyInfo property = classType.GetProperty(propertyName); 
     return property.GetValue(instance, null).ToString(); 
    } 

이로드 할 클래스의 종류와 일부 XML 데이터로 LoadFromXmlData를 호출합니다. LoadFromXmlData 메소드를 호출에 대한 반사를 방지하기 위해, 모든 동적으로로드 유형이 구현해야하는 인터페이스를 만들어야에서


:

interface IXmlLoadable 
{ 
    void LoadFromXmlData(Type type, string data); 
} 

그런 다음 메서드 호출이로 단순화 될 수있다 :

((IXmlLoadable)instance).LoadFromXmlData(classType, myData)); 

당신이 C# 4를 사용하는 경우 SI하는 동적 키워드를 사용할 수 있습니다 반사 작업을 구체화 :

private static string GetPropertyValue(Assembly assembly, string className,  
    string propertyName) 
{ 
     dynamic instance = assembly.CreateInstance(className); 
     Type classType = instance.GetType(); 
     instance.LoadFromXmlData(classType, "<xml></xml>"); 
     PropertyInfo property = classType.GetProperty(propertyName); 
     return property.GetValue(instance, null).ToString(); 
} 
2

가 인스턴스 메소드의 경우, 당신은 당신이 뭔가를 할 필요가 생각

Object _Class1 = Type.GetType("Class1").GetConstructor(new Type[0]).Invoke(null); 
Type.GetType("Class1").GetMethod("LoadFromXmlData" typeof (Class1).GetMethod("LoadFromXmlData").Invoke(_Class1, new[]{myData.ToString()}); 
+0

에 저장된 문자열의 데이터로 해당 속성을 설정해야합니다. 감사하지만 'Class1 _Class1;'을 선언 할 수 없습니다. 위의 표본에 나와 있습니다. 그 클래스는 또한 메서드에 전달할 className 문자열을 사용하여 동적으로 인스턴스화해야합니다. – San

+0

@san 컴파일 타임에 클래스가있는 어셈블리를 참조하고 있습니까? –

+0

예 컴파일 타임에 클래스가있는 어셈블리를 참조합니다. – San

0

을 수행 할 수 있습니다 "는 의회 공인입니다. 예를 들어, 클래스의 조립 자격을 갖춘 이름은 다음과 같습니다 중립 하여 MyAssembly

TopNamespace.SubNameSpace.ContainingClass + NestedClass, 버전 = 1.3.0.0, 문화 =을, PublicKeyToken = b17a5c561934e089

0

Activator.CreateInstance() 메서드를 사용하여 클래스의 인스턴스를 만들어야한다고 생각합니다. 그리고 당신은 객체에서 직접 메소드를 호출 할 수 있습니다.

class Program 
{ 
    static void Main(string[] args) 
    { 
     Assembly asm = Assembly.GetExecutingAssembly(); 
     Sample s1 = Activator.CreateInstance(typeof(Sample)) as Sample; 
     s1.SayHello(); 
    } 
} 

public class Sample 
{ 
    public void SayHello() 
    { 
     Console.WriteLine("Hello World"); 
    } 
} 
관련 문제