在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。
感谢您的帮助,请保持谦虚。我真的不知道我在做什么,我可能使用了一些错误的术语。
答案 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);
}