【发布时间】:2016-07-06 18:15:22
【问题描述】:
我有一个带有泛型方法的泛型类:
public class GenericClass<T> where T : class
{
public void GenericMethod<T>(T item)
{
// do work here
}
}
我还有一个具有多个属性的对象,其中一些可以是其他对象:
public class TestObject
{
public ChildObject ChildObject { get; set; }
}
然后我尝试使用一个泛型方法,该方法将通过 TestObject 进行反映,并为所有属性调用 GenericMethod为了简单起见,本示例中没有包含该代码):
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);
}
}
问题是我是否尝试更改属性的类型(如上例所示)还是我将属性直接传递给method.Invoke,例如:
method.Invoke(propertyModel, null);
我仍然收到同样的错误:
对象与目标类型不匹配。
在运行时方法是:
GenericMethod(TestProject.ChildObject)
而 castedObject 是:
TestProject.ChildObject
我很困惑为什么我会收到我的错误,当看起来强制转换的对象正是该方法正在寻找的类型时。
编辑 1 包括我在发布问题时最初遗漏的对 GetValue 的调用。
【问题讨论】:
-
不太清楚你在问什么。错误的原因很明显:
property是一个PropertyInfo对象,没有理由期望它可以转换为属性返回 的类型。也许您打算先获得property.GetValue(item)?但在这种情况下,我认为您根本不需要致电Convert.ChangeType()。请提供一个良好的 minimal reproducible example 以可靠地重现您的问题,并准确描述代码的作用以及您希望它做什么。 -
我很抱歉。在我尝试简化代码以便在此处发布时,我忘记包含对 GetValue 的调用。但是,我将 GetValue 用于动态对象,以便在转换之前获取实际对象。是的,您会认为我不需要强制转换对象,但是我这样做只是为了验证是否会发生相同的错误。
标签: c# generics reflection properties casting