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]"); } }
}

是类,我以这种方式使用反射:

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 异常提供了运行时错误。如何使用反射从属性列表中获取值?

4

1 回答 1

0

gridRow是对Type对象的引用。of 的第一个参数GetValue是目标对象 - 所以这就像您试图访问对象的SomeClass属性一样Type。这显然行不通。

虽然有一些在不引用实例的情况下评估实例属性的 hacky 方法——只要该属性不使用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();
    ...
}
于 2012-07-31T21:18:17.333 回答