将泛型引入到从非泛型类继承的构造函数中

时间:2019-02-10 23:08:13

标签: c# generics constructor

问题:

是否有变通办法,可以在从未定义泛型类型的类继承的类的构造函数中使用泛型?


说明:

我正在创建一个继承自ValidationAttribute类的新自定义属性。我想在构造函数中使用通用类型,如下所示:

DateValidationAttribute : ValidationAttribute {

   public void DateValidationAttribute <TData>(Expression<Func<TData, DateTime?>> property){ ... }

}

但是,由于TData和TProperty泛型类型未被识别为泛型,因此似乎不允许这样做。另外,我无法在类定义中定义泛型,因为它是从ValidationAttribute类继承的。我得到的错误是未定义TData和TProperty。


目标:

向下传递和表达的目标,以具有强类型传递属性名称的方式。我正在编写此属性以比较类的两个属性。下面的实现是它的样子。在此之下,我希望实现看起来像这样:

Current:

public DateTime? ToDate { get; set; }

[DateValidation("ToDate")]
public DateTime? FromDate { get; set; }

Goal:

public DateTime? ToDate { get; set; }

[DateValidation(prop => prop.ToDate)]
public DateTime? FromDate { get; set; }    

1 个答案:

答案 0 :(得分:2)

在属性中不支持泛型的问题最少。属性只能具有特定的subset of types (primitives, enums, String, Type and single-dimensional arrays) as constructor arguments,不能具有lambda。因此,即使您可以使用泛型,也无法做您想做的事情。

考虑使用字符串作为构造函数参数并使用nameof(),例如:

[DateValidation(nameof(ToDate))]

这种方法使名称与不动产名称保持同步,因此您在重构等时可以获得所需的安全性。