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异常提供了运行时错误。如何使用Reflection?
从属性列表中获取值答案 0 :(得分:0)
gridRow
是对Type
对象的引用。 GetValue
的第一个参数是目标对象 - 所以就像您尝试访问SomeClass
对象上的Type
属性一样。这显然无法奏效。
虽然是 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();
...
}