C#使用反射获取给定的实例化类,该类具有包含其名称的字符串变量

时间:2018-09-21 17:14:28

标签: c# reflection getvalue getproperty

在C#中,我有一个类“ CItems”的多个实例化(请参见下文)。我在要使用的实例化的运行时检索一个字符串(在这种情况下,调用一个公共方法“ addPropertyToList”)。我知道我必须使用反射,但似乎无法正确处理。

CItems me = new CItems();
CItems conversations = new CItems();

string whichCItem = "me"

properties = <whichCItem>.addPropertyToList(properties, "FirstName", "Ken");

我尝试了很多类似的事情:

var myobject = this;
string propertyname = "me";
PropertyInfo property = myobject.GetType().GetProperty(propertyname);
object value = property.GetValue(myobject, null);

但这导致: 你调用的对象是空的。因为属性最终为null。

感谢您的帮助,请保持谦虚。我真的不知道我在做什么,我可能使用了一些错误的术语。

2 个答案:

答案 0 :(得分:0)

简单的Dictionary<T, U>可能适合您。 考虑一个例子:

CItems me = new CItems();
CItems conversations = new CItems();
... 
var dic = new Dictionary<string, CITems>();
doc.Add("me", me); 
doc.Add("conversations", conversations);
... 

//find object 
CITems result= null; 
dic.TryGetValue(searchString, out result);

答案 1 :(得分:0)

PropertyInfo property = myobject.GetType().GetProperty(propertyname);

这是检索由propertyname标识的属性的正确方法。您已经知道它声明的类型,因此只需使用

var propertyInfo = CItems.GetProperty(propertyname)

检索 class 属性。现在您需要做的是在已标识的实例上设置该属性,以便您可以调用

propertyInfo.SetValue(<instance>, value);

如何识别您的实例?当然,您没有回传存储对象指针的变量的名称吗?

是否可以实现以下目标?

IEnumerable<CItems> myItems = new { new CItem("me"), new CItem("conversations") }


void somemethod(string instanceName, string propertyname)
{
    var instance = myItems.FirstOrDefault(item => item.Name == instanceName);
    if(instance == null) return;

    var propertyInfo = CItems.GetProperty(propertyname);
    propertyInfo.SetValue(instance, value);
}