0

我正在尝试使用 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给出错误不能隐式转换derviedObjT

4

3 回答 3

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>();

那么你将无法投射DrivedClassMoreDrivedClass. Foo将为空。

于 2016-05-31T05:29:35.003 回答
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 ;
  }
}
于 2016-05-31T05:28:07.970 回答
0

尝试使用 Activator.CreateInstance。

public class DrivedClass: BaseClass,Interface
{
  public T method<T>() where T : BaseClass
    {
      var derviedObj = Activator.CreateInstance(typeof(T));
      return (T)derviedObj ; 

    }
}


 DrivedClass drOb = new DrivedClass ();
 var v = drOb.method<desiredType_T>();
于 2016-05-31T05:53:01.430 回答