繁体   English   中英

没有使用反射的实例化对象的GetProperties列表中的GetValue

[英]GetValue from list of GetProperties without an instantiated object using reflection

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

gridRow是对Type对象的引用。 GetValue的第一个参数旨在作为目标对象-就像您要尝试访问Type对象上的SomeClass属性一样。 这显然是行不通的。

虽然 哈克的方式评估实例属性,而不必实例的引用的-只要物业不使用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();
    ...
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM