2013-08-24 34 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-叔 - 可以是任何類型,以及如何通過反思

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

感謝幫助投MyGenericProperty類不知道噸。

回答

7

首先,重要的是要明白,你沒有「通用屬性」 - 沒有這種東西。你有一個屬性,它的類型是一個泛型類型...這不是一回事。 (與此相比,具有通用型或通用方法,其中的每一個是在引入新類型參數方面真正通用的。)

可以使用這個代碼測試:

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

但作爲鑄造 - 這取決於你以後想要做什麼。您可能想要聲明一個非泛型基類型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 
} 

如果這些提示不幫你,請給你想要做什麼的更多細節。