2009-09-21 38 views
8

Çalışma zamanında bilinen bir tür parametresiyle bir sınıfın genel yöntemini çağırmayı içeren bir sorum var. Belirli yılındaÇalışma zamanında belirlenen bir tür parametresiyle genel bir işlev çağrısı

, kod şöyle görünür:


FieldInfo[] dataFields = this.GetType().GetFields(BindingFlags.Public | BindingFlags.Instance); 

// data is just a byte array used internally in DataStream 
DataStream ds = new DataStream(data); 

foreach (FieldInfo field in dataFields) 
{ 
    Type fieldType = field.FieldType; 

    // I want to call this method and pass in the type parameter specified by the field's type 
    object objData = (object) ds.Read<fieldType>(); 
} 

Oku() fonksiyonu şöyle görünür:


public T Read() where T : struct 

Bu işlevin amacı bir bayt dizisi okunan verileri döndürmektir.

Böyle bir çalışma zamanında genel bir yöntemini çağırmanın bir yolu var mı?

cevap

12

bu tek Tipi parametresi ile Okuma işlevi olmayan bir jenerik aşırı yapmak olacaktır işlemek için en kolay yolu: olmayan jenerik versiyonu diyoruz

public object Read(Type t) 

Sonra jenerik sürümüne sahip:

public T Read<T>() where T : struct 
{ 
    return (T)Read(typeof(T)) 
} 
+0

Cevabınız için teşekkürler, bu kadar basit bir tasarım değişikliğini hiç düşünmedim. –

+0

Sorunum, OP sorusu gibi görünmüyordu, ancak bilmem gereken şeyi tam olarak gösterdiniz. Teşekkürler! – KennyZ

7

Sen Oku yöntemini bir MethodInfo inşa etmek ve çağırmak gerekir:

MethodInfo method = typeof(DataStream).GetMethod("Read"); 
MethodInfo generic = method.MakeGenericMethod(fieldType); 
object objData = generic.Invoke(ds, null); 
+0

Tekrar teşekkürler Reed, yardımınız çok takdir ediliyor. –

1

Lee'nin yoluna gitmek muhtemelen daha iyi olurdu. Jenerikler, birçok farklı türde sınıf için ortak kod yazmak zorunda kalmanızı önlemek için tasarım zamanında kısaltılır. Derleme zamanında, genel bir yönteme veya sınıfa yapılan her çağrı temel olarak tamamen ayrı bir sınıf olarak oluşturulur.

Sadece basmak ve yansıma kullanmak için çok daha basit, zaten yapmak zorunda olduğun şey budur.

+0

Doğru, Lee'nin yöntemi daha iyi performansa sahip olacaktır, çünkü MethodInfo'nun alınmasına yönelik ek yansıma, yöntemi ile önlenebilecek ek hesaplama olacaktır. –

İlgili konular