employee.GetType()上的System.Reflection.TargetException.GetProperty(property.Name)

时间:2015-08-05 13:30:25

标签: c# system.reflection

我遇到了一个我似乎无法解决的问题。我确定对此有一个简单的解释,但我不明白为什么我得到一个System.Reflection.TargetException:'对象与目标类型不匹配'当我尝试从(在这种情况下)雇员对象获取属性时。

employee.GetType().GetProperty(property.Name)

搜索错误会返回许多描述调用Set / GetValue方法问题的结果,但我还没有找到解决方案。

我设置了一个抛出异常的断点,它表明property.Name确实是一个值 - 而且是对象的一个​​不动产。我还尝试手动指定我知道存在的属性。还是一样。

有什么建议吗?

编辑:改为尝试以下内容:

Type type = typeof (Employee); //Throws the TargetException
PropertyInfo theProperty = type.GetProperty(property.Name);

现在在上面的第一行抛出相同的异常。

编辑:添加了有关我正在构建的应用程序的代码和更多详细信息。

Employee的类定义(为了简化映射到JSON数据,这个类"表示",类/字段是挪威语 - 这是数据的格式/语言,抱歉:-)。 )

" Ansatt" =员工。 " Ansattnummer" =员工没有。

[JsonObject]
public class Ansatt
{
    public int Ansattnummer { get; set; }
    public string Fornavn { get; set; }
    public string Etternavn { get; set; }
    public int Pin { get; set; }
    public string Adresse { get; set; }
    public int Postnummer { get; set; }
    public string Poststed { get; set; }
    public int TlfPrivat { get; set; }
    public int MobilTlf { get; set; }
    public string EpostAdresse { get; set; }
    public DateTime Fodt { get; set; }
}

我的应用程序从Web服务检索给定的数据集 - 它可以是员工,项目或一些其他可能的数据集。要获取的数据是在运行时由用户确定的。用户还可以通过URL查询指定哪些部分,例如,他/她想要的数据集的列。然后程序使用所选数据创建一个csv文件。

这是我用于此的代码:

 if (records != null && records.Count != 0) //records contains the chosen dataset - in this case Employees (Ansatt).
                {
                    if (records.GetType() == typeof (List<Ansatt>))
                    {
                        foreach (var model in records as List<Ansatt>)
                        {
                            var temp = new Ansatt();

                            foreach (var property in model.GetType().GetProperties())
                            {

                                var currentProperty = model.GetType().GetProperty(property.Name);

                                if (currentProperty != null)
                                {
                                    Type type = typeof (Ansatt); //Throws System.Reflection.TargetException: 'Object does not match target type'
                                    PropertyInfo tempProperty = type.GetProperty(property.Name);
                                    tempProperty.SetValue(temp, currentProperty.GetValue(property.Name));
                                }
                            }

                            csv.WriteRecord(temp);

                        }
                    }

                }

3 个答案:

答案 0 :(得分:2)

您需要指定属性的名称

PropertyInfo value = employee.GetType().GetProperty("Name");

答案 1 :(得分:1)

为了通过反射获取对象的属性,确保属性名称是公共的getter和setter,否则它将返回null。

实施例。

public class Employee
{
   public string YouProperty { get; set; }
}

var employee = new Employee();

var result = employee.GetType().GetProperty("YouProperty");

// The result is property info

请阅读一些信息here

答案 2 :(得分:1)

MSDN那样,你应该这样使用它:

class MyClass {
    private int myProperty;
    // Declare MyProperty. 
    public int MyProperty {
        get {
            return myProperty;
        }
        set {
            myProperty = value;
        }
    }
}

public class MyTypeClass {
    public static void Main(string[] args) {
        try {
            // Get the Type object corresponding to MyClass.
            Type myType = typeof(MyClass);
            // Get the PropertyInfo object by passing the property name.
            PropertyInfo myPropInfo = myType.GetProperty("MyProperty");
            // Display the property name.
            Console.WriteLine("The {0} property exists in MyClass.", myPropInfo.Name);

            // Instantiate MyClass
            var myObject = new MyClass()
            {
                MyProperty = 5
            };

            // Get value using reflection
            Console.WriteLine("My property value for my object is {0}.", myPropInfo.GetValue(myObject));

        } catch (NullReferenceException e) {
            Console.WriteLine("The property does not exist in MyClass." + e.Message);
        }
    }
}

对于您的代码,当您想要获取对象实例的属性值时,您应该将对象作为对PropertyInfo.GetValue(object)函数的引用传递。 而不是:

tempProperty.SetValue(temp, currentProperty.GetValue(property.Name));

这样做:

tempProperty.SetValue(temp, currentProperty.GetValue(model));