通用类型,使用接口的不同泛型类型?

时间:2009-11-18 07:13:14

标签: c# asp.net generics

我对仿制药很新,我在理解它们如何工作的部分方面遇到了一些麻烦,也没有按照我想要的方式使它工作。

到目前为止,我有这个;

public interface IObjectMapper
{
    T MapObject<T>() where T : new();
}

public class CustomObjectMapper : IObjectMapper
{
    T IObjectMapper.MapObject<T>()
    {
        T retObject = new T();
        //do stuff......
    }
}

这很好用,但我不明白“T:new()”在做什么。有人可以解释一下吗?另外,对于我的第二个问题 - 我想要一个名为DemapObject的第二个方法,它接受2个参数,来自对象的相同泛型类型T,然后不同的泛型类型的U - U也应该是返回类型。

public interface IObjectMapper
{
    T MapObject<T>() where T : new();
    U DemapObject<T, U>() ??????? what goes here?
}

最后,一旦我完成了DemapObject的接口方法 - 它是如何从实现类中调用的?

public class CustomObjectMapper : IObjectMapper
{
    NameValueCollection IObjectMapper.DempaObject<T, NameValueCollection>()
    {
        //is this right????????????
    }
}

2 个答案:

答案 0 :(得分:2)

“where T:”将在T上设置约束。在这种情况下,约束是“new()”。这意味着泛型类型T必须具有不带参数的构造函数。

您可以在同一类型上堆叠where子句:

  class MyClass<T> where T : class, new() { }

或不同类型:

  class MyClass<T,U>
  where T : class, new()
  where U : IMyInterface
  {
  }

答案 1 :(得分:1)

where T: new()要求用作T的任何类型都应该实现默认(无参数构造函数)。否则将无法创建T类的实例。

关于你的上一个问题:你不能专门实现泛型方法。但是你可以做一个专门的接口实现。考虑一下:

public interface IObjectMapper<U> where U:new
{
    T MapObject<T>(U arg) where T:new()
    U DemapObject<T>(T arg);
}
public class CustomObjectMapper : IObjectMapper<NameValueCollection>
{
    T MapObject<T>(NameValueCollection arg) where T:new(){
       ....
    }

    NameValueCollection DemapObject<T>(T arg)
    {
          ....
    }
}


IObjectMapper<NameValueCollection> mapper = new CustomObjectMapper();

我还没有理解你的第二个问题,你能详细说明一下吗?