C# 如何避免在MVC CustomModelBinding中使用魔术字符串?
我有一个方法,根据属性的值确定要为抽象类型实例化的具体类型:C# 如何避免在MVC CustomModelBinding中使用魔术字符串?,c#,model-view-controller,reflection,model-binding,C#,Model View Controller,Reflection,Model Binding,我有一个方法,根据属性的值确定要为抽象类型实例化的具体类型: private static Type GetModelType(ControllerContext controllerContext, ModelBindingContext bindingContext, Type modelType) { if (modelType != typeof(MyAbstractClass)) return modelType; var key = "MyAbstract
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"
细节:我们把我绑在猪身上,在泥里滚。我没想到这会起作用,因为
ConcreteTypeEnum
不是静态的。。。但确实如此!