反射:获取初始化auto-property的真实类型(c# 6)

本文关键字:类型 真实 获取 初始化 auto-property 反射 | 更新日期: 2023-09-27 18:11:50

我有一个这样声明的类:

public class MyClass
{
    public IMyInterface1 Prop1 { get; } = new MyImplementation1();
    public IMyInterface2 Prop2 { get; } = new MyImplementation2();
    public IMyInterface3 Prop3 { get; } = new MyImplementation3();
    //[...]
}

我想要实现类型的列表,使用反射。我没有MyClass的实例,只有类型。

,

static void Main(string[] args)
{
    var aList = typeof(MyClass).GetProperties(); // [IMyInterface1, IMyInterface2, IMyInterface3]
    var whatIWant = GetImplementedProperties(typeof(MyClass)); // [MyImplementation1, MyImplementation2, MyImplementation3]
}
IEnumerable<Type> GetImplementedProperties(Type type)
{
    // How can I do that ?
}

PS:我不确定这个标题是否改编得很好,但我没有找到更好的。我愿意听取建议。

反射:获取初始化auto-property的真实类型(c# 6)

反射是类型元数据自省,因此,它无法获得给定类型的实际实例在其属性中可能包含的内容,除非您提供所谓类型的实例。

这就是为什么像PropertyInfo.GetValue这样的反射方法有第一个强制参数的主要原因:声明属性的类型的实例。

如果你想用反射来做这个,你就走错方向了。实际上你需要一个语法分析器,幸运的是,c# 6附带了一个新的、漂亮的编译器,以前被称为Roslyn (GitHub存储库)。你也可以使用NRefactory (GitHub仓库)。

都可以用来解析实际的c#代码。您可以解析整个源代码,然后获得表达式体属性中返回的类。

没有类实例就不能得到真正的类型,因为属性只针对实例初始化。例如,对于类,您可以这样做

List<Type> propertyTypes = new List<Type>();
PropertyInfo[] properties = typeof(MyClass).GetProperties();
foreach(PropertyInfo propertyInfo in properties)
{
    propertyTypes.Add(propertyInfo.GetValue(myClassInstance));
}