2011-01-04 22 views
11

Aşağıdaki gibi bir jenerik Tipim varKapalı genel tür bilmeden genel özellik nasıl erişilir

public class TestGeneric<T> 
{ 
    public T Data { get; set; } 
    public TestGeneric(T data) 
    { 
     this.Data = data; 
    } 
} 

Eğer bir nesneyi (ki bazı harici kaynaklardan geliyor) varsa, bunun türünün kapalı olduğunu test ettim. TestGeneric <> TypeParameter T'yi tanıyor. Şimdi nesnemin Verilerine erişmem gerekiyor. Sorun şu ki, hangi kapalı TestGeneric'i tam olarak bildiğimden, nesneyi atamıyorum.

emin olmak için

// thx to http://stackoverflow.com/questions/457676/c-reflection-check-if-a-class-is-derived-from-a-generic-class 
private static bool IsSubclassOfRawGeneric(Type rawGeneric, Type subclass) 
{ 
    while (subclass != typeof(object)) 
    { 
     var cur = subclass.IsGenericType ? subclass.GetGenericTypeDefinition() : subclass; 
     if (rawGeneric == cur) 
     { 
      return true; 
     } 
     subclass = subclass.BaseType; 
    } 
    return false; 
} 

kullanıyorum, nesneyim genel tiptedir. Söz konusu kod şöyledir:

public static void Main() 
{ 
    object myObject = new TestGeneric<string>("test"); // or from another source 
    if (IsSubclassOfRawGeneric(typeof(TestGeneric<>), myObject.GetType())) 
    { 
     // the following gives an InvalidCastException 
     // var data = ((TestGeneric<object>)myObject).Data; 

     // if i try to access the property with reflection 
     // i get an InvalidOperationException 
     var dataProperty = typeof(TestGeneric<>).GetProperty("Data"); 
     object data = dataProperty.GetValue(myObject, new object[] { }); 
    } 
} 

Verisine bakmadan veriye ihtiyacım var (iyi, eğer GetType() kullanarak türünü sorabilirmiysem iyi olurdu, fakat gerekli değil) ToString() kullanarak xml'ye dökün.

Herhangi bir öneriniz var mı? Teşekkürler.

+0

mümkün yinelenen (http://stackoverflow.com/questions/3059420/accessing-properties-through-: bu çok daha okunabilir kod kılan mükemmel kullanım örneği jenerik-type-parameter) –

cevap

8

Genel üyelerine erişebilmek için genel bir sınıfın kapalı türünü bilmeniz gerekir. TestGeneric<> kullanımı, size genel argümanları belirtmeden başlatılamayan açık tip tanımını verir.

özelliğin değerini almak için en basit yolu, doğrudan kullanımda kapalı tip yansıtmak için geçerli: bunun için üzgün

public static void Main() 
{ 
    object myObject = new TestGeneric<string>("test"); // or from another source 

    var type = myObject.GetType(); 

    if (IsSubclassOfRawGeneric(typeof(TestGeneric<>), type)) 
    { 
     var dataProperty = type.GetProperty("Data"); 
     object data = dataProperty.GetValue(myObject, new object[] { }); 
    } 
} 
+0

Daha hızlı oldum;) Yine de Thx. –

+0

ben den IsSubclassOfRawGeneric kaynağını var: kullanıma http://www.extensionmethod.net/csharp/type/issubclassofrawgeneric – JoanComasFdz

3

Ahh,. Bu jenerik versiyon işleri, tabii ki, neden birileri dynamic tipine beni işaret vermedi ...

var dataProperty = myObject.GetType().GetProperty("Data"); 
object data = dataProperty.GetValue(myObject, new object[] { }); 
24

Ah, stackies okumalı basit bir hataydı ?? [Genel tür parametre üzerinden erişilmesi özellikleri] arasında

dynamic dynObject = myObject; 
object data = dynObject.Data; 
+1

Resmi MSDN Dokümanlar https://msdn.microsoft.com/en-us/library/Dd264736.aspx Bu gerçekten uygun bir cevap gibi geliyor. Birisi doğru olarak işaretleyebilir mi lütfen? –

İlgili konular