调用泛型的对象方法

时间:2016-09-23 17:09:00

标签: c# .net generics

我有一个传递对象作为泛型的方法。请注意,这些对象不是从同一个类派生的。我有一个函数,无论类型如何都要调用,但由于无法确定类型,因此无法调用。

'T' does not contain a definition for 'Validate'

代码

public void VerifyInput<T>(T obj)
{
    ((T)obj).Validate();
}

这用于验证传入的用户数据。每个类都负责设置自己的验证,但它们不一定以任何方式相关。 我简化了这个,但基本问题仍然存在。如何转换泛型类型以调用对象方法?

2 个答案:

答案 0 :(得分:2)

使用Validate()方法创建一个接口IValidatable,在每个类中实现它,并更改VerifyInput的输入以获取该接口并删除泛型类型。

public void VerifyInput(IValidatable obj)
{
    obj.Validate();
}

事实上,如果你这样做,你可以完全摆脱VerifyInput,只需在目标对象上调用validate。

答案 1 :(得分:2)

  

请注意,这些对象并非来自同一个类。我有一个函数,无论类型如何都要调用,但由于无法确定类型,因此无法调用。

这是您应该使用界面的地方。

public interface IValidatable {
  void Validate();
}

关于你的方法

public void VerifyInput<T>(T obj) where T : IValidatable
{ 
  obj.Validate();
}

执行此操作将确保传入的类型符合接口合同,但不会将其限制为特定的类型定义。