我正试图“向上”一个实体。实体B只有更多的功能。
实体:
public class A
{
public String Name { get; set; }
}
public class B : A
{
public String ForeName { get; set; }
}
我试图以编程方式将A.Name的值转换为B.Name。 我为这个案子写了一个小函数:
public static T Upcast<T>(Type typeOf, Object obj) where T : new()
{
var target = new T();
var props = obj.GetType().GetProperties();
var targetProps = target.GetType().GetProperties();
foreach (var prop in props)
{
foreach (var tp in targetProps)
{
if (prop.Name.Equals(tp.Name))
{
var val = prop.GetValue(props, null);
tp.SetValue(null, val, null);
}
}
}
return target;
}
在这种情况下:我的目标是B类,我的obj是A类
但它会在第二个循环中触发异常:
var val = prop.GetValue(props, null);
例外“对象与目标类型不匹配”。
我正常地调用该函数:
static void Main(string[] args)
{
var a = new A {Name = "Smith"};
var resp = Upcast<B>(a.GetType(), a);
Console.ReadLine();
}
答案 0 :(得分:1)
您必须使用目标对象作为参数调用prop.GetValue(...);
,而不是使用属性集合:
prop.GetValue(obj, null);
答案 1 :(得分:1)
将prop.GetValue(props, null);
替换为prop.GetValue(obj, null);
它给了我“史密斯”。
答案 2 :(得分:0)
从.NET 4.5开始,您可以编写
var val = prop.GetValue(obj);
您正在尝试从PropertyInfo类的实例中读取值。但你想要的是从你的A实例中读取价值。
另一个暗示,更清晰的代码: 不要将A的类型作为参数传递。如果传递A的实例,则您的方法可以生成obj.GetType()。
但是:你为什么这样做?