我需要通过索引或类似的方式访问属性。原因在this already answered question中解释。这个答案使用了Linq,我更喜欢没有依赖性的东西。我无法控制班级。
public class myClass
{
private string s = "some string";
public string S
{
get { return s; }
}
}
class Program
{
static void Main(string[] args)
{
myClass c = new myClass();
// I would like something similar
// or same functionality
string s = c["S"];
}
}
答案 0 :(得分:6)
由于您无法控制该类,因此您可以使用扩展方法和反射来按名称获取属性值:
static class ObjectExtensions
{
public static TResult Get<TResult>(this object @this, string propertyName)
{
return (TResult)@this.GetType().GetProperty(propertyName).GetValue(@this, null);
}
}
用法:
class A
{
public string Z
{
get;
set;
}
public int X
{
get;
set;
}
}
class Program
{
static void Main(string[] args)
{
A obj = new A();
obj.Z = "aaa";
obj.X = 15;
Console.WriteLine(obj.Get<string>("Z"));
Console.WriteLine(obj.Get<int>("X"));
Console.ReadLine();
}
}
答案 1 :(得分:3)
使用(编辑 - 根据评论):
string s = c.GetType().GetProperty ("S").GetGetMethod().Invoke (c, null).ToString();
它为您提供了实例S
的名为c
的(公共)属性的值,无论c
的类型如何,并且根本不使用LINQ,尽管我必须承认我不明白为什么LINQ应该是一个问题...
答案 2 :(得分:0)
您可以通过在类和集合上使用默认属性来实现相同的功能。如果您总是需要字符串,则可以使用Dictionary类作为默认属性。
然后在构造函数中,您可以初始化myDictionary["s"] = "some string";
然后您可以将myClass用作集合,因此myClass [“s”]将返回“some string”。
反射通常表明您没有创建API来完成您需要的工作,如果您要修改代码,那么我建议您使用默认属性。
请参阅此MSDN article: