反射将属性转换为另一个实例

时间:2014-01-09 07:06:01

标签: c# entity-framework reflection properties

我正试图“向上”一个实体。实体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();
}

3 个答案:

答案 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()。

但是:你为什么这样做?