如何获取属性的静态类型?

时间:2017-11-07 15:11:32

标签: c#

我试图在类上引用属性的类型,但我无法弄清楚语法:

List<IChildInfo<typeof(MappingModel.identifier)>> mappings;

这在.NET中是否可行?

public class MappingModel
{
    public long identifier { get; set; }
}

4 个答案:

答案 0 :(得分:2)

您提供的代码无法使用,因为编译器必须使用您指定的类型为该特定列表创建专用类型。

最简单的修复方法是“即时”(或在运行时)进行通用专业化。

示例代码:

// retrieve the property which type you want to get
var propertyInfo = typeof(MappingModel).GetProperty("identifier");
// get that property's type
Type propertyType = propertyInfo.PropertyType;

// now that you have a property type you can make a specialized generic type:
Type ichildtype = typeof(IChildInfo).MakeGenericType(propertyType);
// create a type definition for that particular list
Type listtype = typeof(List<>).MakeGenericType(ichildtype);
// create an instance of that list
Activator.CreateInstance(listtype);

Try this online

答案 1 :(得分:1)

首先检查周围类的类型,然后获取其属性:

var p = typeof(MappingModel).GetProperties.FirstOrDefault(x => x.Name == "identifier");

或者:

var p = typeof(MappingModel).GetProperty("identifier");

现在您可以通过PropertyType获取该属性的类型:

var t = p.PropertyType;

然而,由于这是运行时 - 信息,编译器无法创建该类型列表的实例。您可以创建类型实现的接口,然后创建它的列表:

var l = new List<IChildInfo<MyInterface>>();

MappingModel.identifier的类型实现MyInterface。但这假设IChildInfo是共变体:

interface IChildInfo<out T> { ... }

答案 2 :(得分:0)

你需要使用Reflection。

我不确定你想要做什么,但你可以得到一个班级的所有财产:

typeof(MappingModel).GetProperties();

然后你可以玩这些属性。

答案 3 :(得分:0)

您可以获取属性的类型,但是您将无法使用普通语法将其用作通用参数。您可以使用MethodInfo来调用将使用mappings的方法。 This answer可能会对您有所帮助。