2014-12-02 82 views
0

我想加载一个DLL,并为每种类型显示属性名称和值。我有下面的代码,它抛出一个System.Reflection.TargetException与消息“对象不符合目标类型”。反射从DLL中的所有类型获取值

var DLL = Assembly.LoadFrom(PathToDLL); 
       foreach (Type type in DLL.GetTypes()) 
       { 
        foreach (PropertyInfo property in type.GetProperties()) 
        { 
         lstProperties.Items.Add(string.Format("{0} - {1}", property.Name, property.GetValue(DLL, null))); 
        } 
       } 

我试过用GetValue()调用使用类型,DLL和null,我做错了什么?

我测试对这个DLL有一个属性:

public string TheValue{ get; set; } 

感谢所有。

+3

您需要一个类型的实例来获取实例属性的值。 – 2014-12-02 20:55:52

+1

你不能显示一个**类**属性的值,没有一个。您只能显示**对象**属性的值。这是类和对象之间的区别很重要的地方。 – MikeSW 2014-12-02 20:57:51

+1

当然,在程序集中可能有类型,你不能实例化(抽象类可以想到)。在实例化所有你可以使用的类型之前,你应该三思而后行,它基本上运行着你不能控制的任意代码(再次,加载任意程序集也是如此)。 – 2014-12-02 20:59:51

回答

2

扩展评论,这里是他们正在谈论的一个例子。

在DLL:

public class TheClass 
{ 
    public string TheValue { get; set; } 
} 

创建类的实例,并设置属性值:

TheClass cls = new TheClass(); 
cls.TheValue = "hello!"; 

然后改变你的代码来引用您创建的实例:

lstProperties.Add(string.Format("{0} - {1}", property.Name, property.GetValue(cls, null))); 
+0

我看到我要去哪里错了。谢谢! – Jay 2014-12-02 21:08:16