我有确定具体类型实例化用于基于属性的值的抽象类型的方法:
private static Type GetModelType(ControllerContext controllerContext,
ModelBindingContext bindingContext, Type modelType)
{
if (modelType != typeof(MyAbstractClass)) return modelType;
var key = "MyAbstractClass.ConcreteTypeEnum";
if (bindingContext.ValueProvider.ContainsPrefix(key))
{
var concreteTypeName = bindingContext.ValueProvider.GetValue(key).AttemptedValue;
modelType = Type.GetType(
$"{modelType.Namespace}.{concreteTypeName}, {modelType.Assembly}" );
}
}
return modelType;
}
我如何(使用反射,可能)确定不使用字符串找到它的财产"MyAbstractClass.ConcreteTypeEnum"
的名字吗?如果有人重命名的财产,我不希望我的modelbinding打破。
我沿线的一些思考
var key = modelType.GetProperty(t => t.ConcreteTypeEnum).Name
......但没有这样的小动物存在。
您可以使用nameof
获取属性和类名作为字符串。这样,如果你得到如编译时安全重命名类或属性时。使用它像这样:
var propertyName = nameof(MyAbstractClass.ConcreteTypeEnum);
// propertyName is now "ConcreteTypeEnum"
var className = nameof(MyAbstractClass);
// className is now "MyAbstractClass"
详细信息:https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/nameof