反射:获取已初始化 auto-property 的真实类型 (C#6)
Reflection : Get the real type of a initialized auto-property (C#6)
我有一个这样声明的 class :
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:我不确定这个标题是否改编得很好,但我没有找到更好的。我乐于接受建议。
没有 class 实例就无法获得真实类型,因为属性仅为实例初始化。例如class,你可以这样做
List<Type> propertyTypes = new List<Type>();
PropertyInfo[] properties = typeof(MyClass).GetProperties();
foreach(PropertyInfo propertyInfo in properties)
{
propertyTypes.Add(propertyInfo.GetValue(myClassInstance));
}
反射是类型元数据内省,因此,除非您提供所谓类型的实例,否则它无法获取给定类型的实际实例在其属性中可能包含的内容。
这就是像 PropertyInfo.GetValue
这样的反射方法具有第一个强制参数的主要原因:声明 属性 的类型的实例。
如果你想为此使用反射,你就走错了方向。 实际上您需要一个语法分析器,幸运的是,C# 6 附带了新的高级编译器,以前称为 Roslyn (GitHub repository). You can also use NRefactory (GitHub repository)。
两者都可用于解析实际的 C# 代码。您可以解析整个源代码,然后获取 类 在表达式主体属性中返回的内容。
我有一个这样声明的 class :
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:我不确定这个标题是否改编得很好,但我没有找到更好的。我乐于接受建议。
没有 class 实例就无法获得真实类型,因为属性仅为实例初始化。例如class,你可以这样做
List<Type> propertyTypes = new List<Type>();
PropertyInfo[] properties = typeof(MyClass).GetProperties();
foreach(PropertyInfo propertyInfo in properties)
{
propertyTypes.Add(propertyInfo.GetValue(myClassInstance));
}
反射是类型元数据内省,因此,除非您提供所谓类型的实例,否则它无法获取给定类型的实际实例在其属性中可能包含的内容。
这就是像 PropertyInfo.GetValue
这样的反射方法具有第一个强制参数的主要原因:声明 属性 的类型的实例。
如果你想为此使用反射,你就走错了方向。 实际上您需要一个语法分析器,幸运的是,C# 6 附带了新的高级编译器,以前称为 Roslyn (GitHub repository). You can also use NRefactory (GitHub repository)。
两者都可用于解析实际的 C# 代码。您可以解析整个源代码,然后获取 类 在表达式主体属性中返回的内容。