2013-08-24 2 views
3

일반 속성을 사용하는 클래스가 있습니다. 예를 들면 :C# 일반 속성으로 리플렉션 사용

class Person 
{ 
    public MyGenericProperty<string> Field1 
    { 
     get { return field1; } 
     set { field1 = value; } 
    } 

    private MyGenericProperty<string> field1= new MyInheritedGenericProperty<string>("Alan1"); 
} 

내가 다른 클래스에서 반사와이 클래스를 사용하려면 그리고 난 내가 가진 그

public void DoSomethingWithProperty(object sourceobject) 
{ 
    foreach (var aProperty in sourceobject.GetType().GetProperties()) 
    { 
     *if(aProperty.PropertyType == typeof(MyGenericProperty<>))* 
     { 
      *var obj = (MyGenericProperty<>)aProperty.GetValue(sourceobject, null);* 
     } 
    } 
    return null; 
} 

같은 방법이 두 가지 문제 유형 검사를 할 수있는 방법

1 일반 재산. 이 예제 코드에서는 if(aProperty.PropertyType == typeof(MyGenericProperty<>))이 작동하지 않습니다. MyGenericProperty의

2 T는 클래스가 될 수있는 방법과 도움에 대한

var obj = (MyGenericProperty<>)aProperty.GetValue(sourceobject, null); 

감사로 반사에 의해 알고있는 T 않고 MyGenericProperty 클래스를 캐스팅 할 수 있습니다.

답변

7

첫째, "일반 속성"이 없다는 것을 이해하는 것이 중요합니다. 그런 것은 없습니다. 타입이 제네릭 타입 인 프로퍼티가 있습니다 ... 그리고 그것은 똑같지는 않습니다. (제네릭 형식 또는 새로운 유형의 매개 변수를 도입 측면에서 진정으로 제네릭 각각의 일반적인 방법과 그 비교.)

당신은이 코드를 사용하여 테스트 할 수 있습니다 다음에 대한

if (aProperty.PropertyType.IsGenericType && 
    aProperty.GetGenericTypeDefinition() == typeof(MyGenericProperty<>)) 

그러나로를 캐스팅 - 나중에 그 값으로 무엇을하고 싶은지에 달려 있습니다. type 매개 변수에 종속되지 않는 모든 멤버가 포함 된 MyGenericProperty<>의 비 일반 기본 형식을 선언 할 수 있습니다. 일반적으로 유형 매개 변수를 지정하지 않고 일반 유형 (예 : MyGenericProperty)과 동일한 이름을 지정합니다. 당신은 단지 그 멤버 중 하나를 필요로하는 경우 그런 다음 사용할 수 있습니다

if (aProperty.PropertyType.IsGenericType && 
    aProperty.GetGenericTypeDefinition() == typeof(MyGenericProperty<>)) 
{ 
    var value = (MyGenericProperty) aProperty.GetValue(sourceObject, null); 
    // Use value 
} 

을하지만 그 경우에 당신은 어쨌든 Type.IsAssignableFrom을 사용할 수

if (typeof(MyGenericProperty).IsAssignableFrom(aProperty.PropertyType)) 
{ 
    var value = (MyGenericProperty) aProperty.GetValue(sourceObject, null); 
    // Use value 
} 

이러한 힌트가 도움이되지 않는 경우,주세요 당신이하려고하는 것에 대한 자세한 내용.