2010-03-19 104 views

回答

2

不,您必须使用反射。
如果最多只能创建一个辅助扩展方法就像这个例子:

using System; 

static class Utils { 
    public static T GetProperty<T>(this object obj, string name) { 
     var property = obj.GetType().GetProperty(name); 
     if (null == property || !property.CanRead) { 
      throw new ArgumentException("Invalid property name"); 
     } 
     return (T)property.GetGetMethod().Invoke(obj, new object[] { }); 
    } 
} 

class X { 
    public string A { get; set; } 
    public int B { get; set; } 
} 

class Program { 
    static void Main(string[] args) { 
     X x = new X() { A = "test", B = 3 }; 
     string a = x.GetProperty<string>("A"); 
     int b = x.GetProperty<int>("B"); 
    } 
} 

这是不好的,但是。
首先是因为您在运行时错误中正在编译时错误。其次,在这种情况下,反思的表现并不合理。 我认为这里最好的建议是,你不应该尝试在C#中编程,就好像它是ActionScript一样。

+0

THX的答复。 我只是想知道是否避免反射是一个选项,因为性能问题。 在这种情况下,代码将用于复合对象结构的递归方法中,该方法使用了很多。 反思如何去这里? –

+0

@Bert Vandamme:我会告诉只有当你不知道对象时才使用反射,但是你可以举个例子吗? –

+0

我认为,在知道属性类型的时候,即使抽象为定义单一属性的接口,也应该知道所有者的类型以避免反射。 :) 我同意,只有在编译时你根本不知道任何东西时才应该使用反射。 – back2dos

0

您可以在类中定义索引:

public class IndexerTest 
{ 
    private Dicionary<string, string> keyValues = new ... 

    public string this[string key] 
    { 
     get { return keyValues[key]; } 
     set { keyValues[key] = value; } 
    } 
} 

而且使用这样的:

string property = indexerTest["propertyName"]; 
+0

括号语法有点误导。在ECMA脚本对象[表达式]中相当于object.ident,如果表达式的字符串表示形式为“ident”。 Bert似乎在寻找的是在C#中执行动态属性访问的同样简短的方法。 – back2dos