我试图在类上引用属性的类型,但我无法弄清楚语法:
List<IChildInfo<typeof(MappingModel.identifier)>> mappings;
这在.NET中是否可行?
public class MappingModel
{
public long identifier { get; set; }
}
答案 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);
答案 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可能会对您有所帮助。