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
不是静态的。。。但确实如此!