【发布时间】:2017-01-16 08:59:05
【问题描述】:
我想验证一个具有泛型属性的类:
class Foo
{
[ValidHistoryDate]
public MyType<string> bar;
[ValidHistoryDate]
public MyType<int> baz;
[ValidHistoryDate]
public MyType<float> bat;
}
class MyType<T>
{
public string date;
public T property;
}
泛型还包含一个日期,属性(字符串),应该根据有效日期进行验证,所以我编写了这个函数来做到这一点:
public class ValidHistoryDateAttribute : ValidationAttribute
{
public override bool IsValid(object value)
{
if (value == null)
return true;
var v = (List<MyType<object>>)value;
bool valid = true;
foreach (var f in v)
{
if (!Regex.Match(f.Date, @"^[0-9]{2}\.[0-9]{2}\.[0-9]{4}$").Success)
valid = false;
}
return valid;
}
}
验证不关心属性“property”,但它应该关心字符串。 不幸的是演员失败:
var v = (List<MyType<object>>)value;
我的意思是:当然可以,因为“object”不是真正的类型。我想对所有类型使用验证属性,在验证中我什至不关心“属性”。
有什么方法可以很好地解决这个问题吗?我不想为每种可能的类型添加 ValidHistoryDateAttribute。
【问题讨论】:
-
为什么将日期保存为字符串?如果您将其保留为 DateTime,则根本不需要此验证...
-
你的类型 Foo 是否应该有
List<MyType<string>>属性?否则,我对为什么您的验证属性在谈论列表感到困惑(鉴于这似乎是问题的核心,这似乎非常重要)。 -
在不确定您的确切代码是什么的情况下,我可以暂时建议考虑一个基类,该基类上有您的字符串日期,然后由您的泛型类继承。这意味着您不需要知道您的类型的泛型类型,因为您可以从非泛型子类中获得所需的一切。如果您也可以将
List<GenericHistory<T>>更改为IEnumerable<GenericHistory<T>>,这可能有助于解决差异问题。 -
另外,您的正则表达式将允许使用诸如
55.77.9999之类的字符串。使用DateTime.TryParseExact(),而不是正则表达式。
标签: c# .net validation .net-core