2016-03-20 15 views
1

:C# çağırır genel metot genel bir yöntem ile bir genel sınıfı vardır

public class TestObject 
{ 
    public ChildObject ChildObject { get; set; } 
} 
:

public class GenericClass<T> where T : class 
{ 
    public void GenericMethod<T>(T item) 
    { 
     // do work here 
    } 
} 

Ayrıca diğer nesneler olabilir bazıları birden fazla özelliklere sahip bir nesne olması

Daha sonra TestObject aracılığıyla yansıtacak genel bir yöntem kullanmaya ve GenericMethod'u kendi içinde ve kendileri de ChildObject gibi özel sınıflar için çağırmaya çalışıyorum (bunun için mirasa dayalı olarak bunu belirlemenin bir yolu var) basit tutmak uğruna yaptı Bu örnek için bu kodu) içermez:

public void ReflectingMethod<T>(T item) 
{ 
    var properties = item.GetType().GetProperties(); 

    foreach (var property in properties) 
    { 
     var type = property.PropertyType; 

     dynamic propertyModel = property.GetValue(model, null); 

     var castedObject = Convert.ChangeType(propertyModel, type); 
     var genericClass = Activator.CreateInstance(typeof(GenericClass<>).MakeGenericType(type)); 
     var method = genericClass.GetType().GetMethod("GenericMethod", new [] { type }); 

     method.Invoke(castedObject, null); 
    } 
} 

sorun olduğunu yukarıdaki örnekte olduğu gibi (tesisin tip değiştirme girişiminde) veya I gibi, method.Invoke doğrudan özelliği Hl:

Çalışma_zamanı yöntemde

Object does not match target type.

olup:

method.Invoke(propertyModel, null); 

hala aynı hata almak

Ve castedObject geçerli:

TestProject.ChildObject

Ben dökme nesne tam yöntem aradığı tipte olduğunun görünür zaman, ben hata alıyorum neden olarak karıştı. DÜZENLEME 1

soru yayınlarken Başlangıçta dışarı bıraktığı getValue çağrısına Dahil.

+2

Ne sorduğunuzu çok açık değil. Hatanın nedeni açıktır: 'property' bir 'PropertyInfo' nesnesidir ve _returns_ property'ye dönüştürülebilmesini beklemek için bir neden yoktur. Belki ilk önce property.GetValue (item) 'i almayı mı düşünüyorsun? Fakat bu durumda, 'Convert.ChangeType()' işlevini çağırmanız gerekmeyecek. Lütfen kodun ne yaptığını ve ne yapmak istediğini tam olarak tanımlamanızın yanı sıra probleminizi güvenilir şekilde yeniden üreten iyi bir [mcve] sağlayın. –

+0

Özür dilerim. Buraya gönderme yapmak için kodu sadeleştirme denememde, aramayı GetValue'ya eklemeyi unuttum. Ancak, gerçek nesneyi dökümden önce almak için GetValue'yi bir dinamik olarak kullanıyorum. Ve evet, sen, ben, sadece, aynı hatanın gerçekleşmesinden bağımsız olarak bunu doğrulamak için yaptım, ancak, ben, o, nesne yapmak gerek olmadığını düşünürdüm. –

cevap

0

arama

method.Invoke(castedObject, null); 

yanlıştır. Eğer bir örnek yöntemini çağırmak çalışıyoruz beri O

method.Invoke(genericClass, new object[] { castedObject }); 

olmalıdır Invoke(object, object[]) ilk argüman this örneği olmalıdır. Statik yöntem için, ilk argüman olarak null'u geçin. Yöntem bağımsız değişkenleri her zaman Invoke yönteminin ikinci object[] bağımsız değişkeninden geçirilir.

+0

Teşekkür ederiz! Tam olarak aradığım şey bu. –