【问题标题】:Refelection Converting Property into another instance反射转换属性到另一个实例
【发布时间】:2014-01-09 07:06:01
【问题描述】:

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

【问题讨论】:

  • 只是出于好奇:您为什么要通过反射来执行此操作,而不是在 B 中有一个构造函数,该构造函数接受 A 的实例并从中进行初始化?

标签: c# entity-framework reflection properties


【解决方案1】:

prop.GetValue(props, null); 替换为prop.GetValue(obj, null);

它给了我“史密斯”。

【讨论】:

  • 谢谢,多么简单! :-)
【解决方案2】:

您必须使用目标对象作为参数调用prop.GetValue(...);,而不是使用属性集合:

prop.GetValue(obj, null);

【讨论】:

    【解决方案3】:

    从 .NET 4.5 开始,您可以编写

    var val = prop.GetValue(obj);
    

    您正在尝试从 PropertyInfo 类的实例中读取值。但是你想要的是从你的 A 实例中读取值。

    另一个提示,更简洁的代码: 不要将 A 的类型作为参数传递。如果你传递一个 A 的实例,你的方法可以生成 obj.GetType()。

    但是:你为什么要那样做???

    【讨论】:

    • 这不起作用:无法解析方法候选者是:GetValue(object, object[])
    • 好的,然后按照另一个答案中的假设使用 prop.GetValue(obj, null) 。 GetValue(obj) 是 .NET 4.5 中的新功能
    猜你喜欢
    • 1970-01-01
    • 2010-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-05
    • 1970-01-01
    • 1970-01-01
    • 2015-01-14
    相关资源
    最近更新 更多