如何使用C#generics

时间:2016-05-31 05:14:49

标签: c# nbuilder

我正在尝试使用NBuilder生成一些测试数据,以便为扩展基类的所有类实现自动化,其中每个类将具有不同的字段。

这是我的代码:

public interface Interface
{
    T method<T>() where T : BaseClass;
}

public class DrivedClass: BaseClass,Interface
{
    public T method<T>() where T : BaseClass
    {
        var derviedObj = Builder<DrivedClass>.CreateNew().Build();

        return derviedObj;
    }
}

return derviedObj提供错误无法将derviedObj转换为T

3 个答案:

答案 0 :(得分:2)

我对nbuilder并不熟悉,但看起来你可以尝试这样的事情:

public class DrivedClass: BaseClass,Interface
{
    public T method<T>() where T : BaseClass
    {
        var derviedObj = Builder<T>.CreateNew().Build();

        return derviedObj;
    }
}

或者,如果那是你真正想要的:

public class DrivedClass: BaseClass,Interface
{
    public T method<T>() where T : BaseClass
    {
        var derviedObj = Builder<DrivedClass>.CreateNew().Build();

        return derviedObj as T;
    }
}

然后你会得到T,但是真的没有机会知道它会成功。添加另一个不会继承DrivedClass的实现时会发生什么?

public class MoreDrivedClass : BaseClass, FooInterface
{

}

然后这个演员会失败:

var drivedClass = new DrivedClass();
var foo = drivedClass.method<MoreDrivedClass>();

然后您将无法将DrivedClass投射到MoreDrivedClassFoo将为空。

答案 1 :(得分:1)

该方法无法返回DerivedClass,因为无法知道T是该类还是其他类:

SomeOtherDerived v = (new DrivedClass()).method<SomeOtherDerived>(); 

目前尚不清楚您想要实现的目标,可能类似于以下示例:

public interface Interface<T> where T : BaseClass
{
    T method();
}

public class DrivedClass: BaseClass,Interface<DerivedClass>
{
  public DerivedClass method()
  {
      DerivedClass derviedObj = Builder<DrivedClass>.CreateNew().Build();
      return derviedObj ;
  }
}

答案 2 :(得分:0)

尝试使用Activator.CreateInstance。

String