私は以下のクラスがあります。このような構造を使用して峠ジェネリック型まで継承ツリー
abstract class Foo<T>
abstract class BaseClass : Foo<BaseClass>
class DerivedOne : BaseClass
class DerivedTwo : BaseClass
、Foo<BaseClass>
からBaseClass
継承から派生するすべてのクラスを。私はDerivedOne
に、私はクラスがFoo<DerivedOne>
になりたいけどDerivedTwo
に、私はクラスがFoo<DerivedTwo>
から派生したい、例えば各派生クラス
の異なるT
のジェネリック型を設定できるようにしたいです。
汎用タイプを継承ツリーに渡す方法はありますか?
私はこのようなことを試みました(これはうまくいかない)。
abstract class Foo<T>
abstract class BaseClass<T> : Foo<T>
class DerivedOne : BaseClass<DerivedOne>
class DerivedTwo : BaseClass<DerivedTwo>
編集:ここでは、実際のコードサンプルです:彼らはジェネリック型
編集#2として自分自身に渡していることを示すためにジェネリック型を変更しました私が使っているクラス:
public abstract class DBObject<T>
where T : DBObject<T>, new()
{
//the generic type is for this method, so I can create an object from a database query
public static T Create(DataRow dataRow)
{
Type T = MethodBase.GetCurrentMethod().DeclaringType;
T obj = new T();
foreach (var field in obj.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Instance))
{
if (dataRow.Table.Columns.Contains(field.Name))
{
Object safeObj = Convert.ChangeType(dataRow[field.Name].ToString(), field.FieldType);
field.SetValue(obj, safeObj);
}
}
foreach (var field in obj.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Instance))
{
Console.WriteLine(field.Name + "=" + field.GetValue(obj));
//propInfo.SetValue(obj, value, null);
}
return obj;
}
}
public abstract class Contact<T> : DBObject<T>
where T : Contact<T>
{
//field and methods ommitted...
}
public class Person : Contact<Person>
{
//fields and methods ommitted...
}
public class Company : Contact<Company>
{
//fields and methods ommitted...
}
回のクラスは、その後、このような方法で使用することができます。
Person person = Person.Create(/* DataRow from a query result */);
あなたは完璧な作品を与えた例では、それはおそらく何か他のもので、なぜあなたはそれが –
動作しないと言うんおそらく、あなたは '抽象クラスBaseClassのをしたいですか? –
@Nobody次のエラーが表示されます。 'タイプ' T 'は、汎用タイプまたはメソッド' Foo 'のタイプパラメータ' T 'として使用できません。 'T'から 'Foo' 'へのボクシング変換や型パラメータ変換はありません。 '' T'はジェネリックでパラメータ 'T'として使用するためにパブリックパラメータなしコンストラクタを持つ非抽象型でなければなりませんタイプまたはメソッド「フー」 ' –
yitzih