: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öntemdeObject 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.
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. –
Ö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. –