2012-07-31 85 views
0
public class SomeClass 
{ 
    public IBy Some1{ get { return By.CssSelector("span[id$=spanEarth]"); } } 

    public IBy Some2 { get { return By.CssSelector("span[id$=spanWorm]"); } } 

    public IBy Some3 { get { return By.CssSelector("span[id$=spanJim]"); } } 
} 

一个实例化的对象是类,而我用这种方式思考:的GetValue不使用反射

var gridRow = Type.GetType(typeof(SomeOtherClassInSameNamespace).AssemblyQualifiedName.Replace("SomeOtherClassInSameNamespace", "SomeClass"), true, true); 

var rowList = gridRow.GetProperties().Where(p => p.PropertyType.Name.Contains("IBy")).ToList(); 

int i = 0; 
foreach (var property in rowList) 
{ 
    string test = property.GetValue(gridRow, null).ToString(); 
} 

这给运行时错误的的objectType例外。我如何从使用反射的属性列表中获取值?

回答

0

gridRow是对Type对象的引用。 GetValue的第一个参数应该是目标对象 - 所以它就像您试图访问Type对象上的SomeClass属性。这显然不起作用。

虽然有是评价一个实例属性的hacky ways,而不必实例的引用 - 只要物业不使用this - 他们真的是非常讨厌的。

如果属性在对象中不需要任何状态,请改为使其成为静态属性。在这一点上,你可以使用null作为目标,它会很好:

public class SomeClass 
{ 
    public static IBy Some1 { get { return By.CssSelector("span[id$=spanEarth]"); } } 

    public static IBy Some2 { get { return By.CssSelector("span[id$=spanWorm]"); } } 

    public static IBy Some3 { get { return By.CssSelector("span[id$=spanJim]"); } } 
} 
... 

var gridRow = Type.GetType(typeof(SomeOtherClassInSameNamespace) 
           .AssemblyQualifiedName 
           .Replace("SomeOtherClassInSameNamespace", "SomeClass"), 
          true, true); 
var rowList = gridRow.GetProperties(BindingFlags.Public | BindingFlags.Static) 
        .Where(p => p.PropertyType.Name.Contains("IBy")); 

int i = 0; 
foreach (var property in rowList) 
{ 
    string test = property.GetValue(null, null).ToString(); 
    ... 
}