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

DrivedClassそうすると、にキャストできなくなりますMoreDrivedClassFoonull になります。

于 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 に答える