RBA*_*RBA 3 .net c# reflection
我知道有很多这样的问题,但我找不到我想做的事情的任何答案。
考虑以下抽象类:
public abstract class TestBase
{
public static ITest Test => Container.Resolve<ITest>();
public static ITest1 Test1 => Container.Resolve<ITest1>();
public static ITest2 Test2 => Container.Resolve<ITest2>();
public static ITest3 Test3 => Container.Resolve<ITest3>();
}
Run Code Online (Sandbox Code Playgroud)
我试图获取从 IDummy 接口继承的所有属性,如下所示:
var members = typeof(TestBase).GetMembers(BindingFlags.Static | BindingFlags.Public)
.Where(f => f.GetType().IsAssignableFrom(typeof(IDummy)) == true);
Run Code Online (Sandbox Code Playgroud)
但列表是空的。如果不添加 where 子句“ .Where(f => f.GetType().IsAssignableFrom(typeof(IDummy)) == true)”,我会得到所有结果,包括属性的 getter。
可能是一些微不足道的事情,但由于我对反射不太熟悉,我无法弄清楚我做错了什么。
您从中返回的GetMembers是MemberInfo实例(或者,对于字段,FieldInfo实例)。因此,您无法直接检查这些对象是否可从 分配IDummy。
您真正想要做的是过滤MemberInfo对象的字段,然后检查FieldType每个对象的属性:
var members = typeof(TestBase).GetMembers(BindingFlags.Static | BindingFlags.Public)
.OfType<FieldInfo>()
.Where(f => typeof(IDummy).IsAssignableFrom(f.FieldType));
Run Code Online (Sandbox Code Playgroud)
另请注意,我颠倒了通话的主题和对象IsAssignableFrom,正如帕特里克的评论中所建议的那样。
正如我刚刚注意到的,您的示例似乎显示了properties而不是fields。不过,一般技术是相同的;只需分别使用PropertyInfo和PropertyType而不是FieldInfo和FieldType。
PropertyInfo最后,您还可以直接使用该方法的重载之一,而不是自己进行过滤GetProperties。
| 归档时间: |
|
| 查看次数: |
1741 次 |
| 最近记录: |