Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是否可以扩展MetadataType类以向字段添加额外的装饰器?_C#_Asp.net Mvc - Fatal编程技术网

C# 是否可以扩展MetadataType类以向字段添加额外的装饰器?

C# 是否可以扩展MetadataType类以向字段添加额外的装饰器?,c#,asp.net-mvc,C#,Asp.net Mvc,c#支持使用MetadataType类将附加的装饰器应用到您不想直接编辑的类(例如,它们可能是从Entity Framework生成的类) 举个简单的例子: //auto generated class definition public partial class DataClass { public string DisplayName {get;set;} } //apply a metadata definition [MetadataType(typeof(DataClass

c#支持使用MetadataType类将附加的装饰器应用到您不想直接编辑的类(例如,它们可能是从Entity Framework生成的类)

举个简单的例子:

//auto generated class definition
public partial class DataClass
{
    public string DisplayName {get;set;}
}

//apply a metadata definition
[MetadataType(typeof(DataClassMetadata))]
public partial class DataClass
{

}

//implement the metadata 
public class DataClassMetadata
{
  [Display(Name = "Display Name")]
  public string DisplayName {get;set;}
}
这一切都很好,很好,直到您有另一个自定义装饰器要添加,它依赖于您不想添加到业务层的依赖项。例如,MVC远程验证需要引用MVC库

我希望能够在web项目中添加另一层元数据,而不会丢失业务层中定义的元数据

我考虑过使用某种类型的继承,可能类似于:

public class RemoteDataClassModelMetadata : DataClassMetadata
{
    [Remote("DataDisplayNameIsValid", "Validation")]
    public string DisplayName { get; set; }
}
然后有一个使用这个元数据定义的视图模型——但这似乎只是隐藏了基类上的装饰器。使类成为partial不会起作用,因为重复的成员甚至不会编译

可以通过将所有MVC引用添加到业务层(但这意味着依赖于业务层的非web应用程序现在必须毫无理由地承担web依赖)或复制web项目中的装饰器来避免此问题(但这似乎是一种会导致奇怪的bug和奇怪行为的事情,在一个项目中,新开发人员没有意识到它们是在两个地方定义的)


对于这种用例,有没有一种方法可以组合来自不同元数据类的装饰器?(或者有没有更好的解决方案,我完全忽略了这个问题?)

您最终做了什么?我们还没有真正巧妙地解决这个问题。目前,我们只需复制ViewModel上元数据类的原始属性,并记住保持它们同步。您最终做了什么?我们还没有真正巧妙地解决这个问题。目前,我们只需复制ViewModel上的原始属性查看模型上的元数据类,并记住保持它们同步。