1

紛らわしい状況です。

基本ジェネリックタイプおよび後継

public abstract class BaseType<TEntity> : where TEntity : BaseType<TEntity>
public class AnyType : BaseType<AnyType>

一般的なループのように見えます)))

私は次のような方法が必要です

public void Method<T>(T data)
{
if(typeof(T).IsSubclassOf(BaseType<????>))
 convert data to BaseType<???> and exec BaseType<>'s method
else
//Do that
}

ジェネリックメソッドでは、TがBaseTypeであり、その上でexecメソッドであることを定義する必要があります。どうやってやるの????

4

3 に答える 3

1

リフレクションを使用し、を使用して階層を上に移動できますType.BaseType。正確な具象クラスによっては、基本型がオープンジェネリック型である可能性があることに注意してください。

class Foo<T> : BaseType<T>

を使用Type.IsGenericTypeDefinitionType.GetGenericTypeDefinitionて、への道を進んでみることができますBaseType<>。基本的に、継承階層内のクラスにジェネリック型の定義があるかどうかを調べたいと思いますtypeof(BaseType<>)。インターフェースを扱っていないことを嬉しく思います。インターフェースは全体をさらに難しくします:)

于 2010-07-22T10:16:14.843 に答える
1

次のコードを使用できます。

static bool IsBaseType<T>()
{
    var t = typeof(T);

    do
    {
        if (t.IsGenericType && t.GetGenericTypeDefinition() == typeof(BaseType<>))
        {
            return true;
        }

        t = t.BaseType;
    }
    while (t != null);

    return false;
}
于 2010-07-22T10:21:48.247 に答える
0

この場合の一般的なパターンは、ジェネリックベースタイプの非ジェネリックベースタイプを持つことです。メソッドにtypeパラメーターが含まれていない場合は、これで完了です。含まれている場合は、Object.Equalsのように、型キャストを行う非ジェネリックメソッドを追加できます。

public abstract class ReallyBaseType
{
    public abstract void SomeMethod();
    public abstract void SomeMethodWithParameter(object o);
}

public abstract class BaseType<TEntity> : ReallyBaseType
    where TEntity : BaseType<TEntity>
{
    public override void SomeMethodWithParameter(object o)
    {
        SomeMethodWithParameter((TEntity)o);
    }

    public abstract void SomeMethodWithParameter(TEntity entity);
}

public class AnyType : BaseType<AnyType>
{
    public override void SomeMethod() { }

    public override void SomeMethodWithParameter(AnyType entity) { }
}

次に、実際のデータタイプを確認できます。

public void Method<T>(T data)
{
    if (data is ReallyBaseType)
    {
        ((ReallyBaseType)(object)data).SomeMethod();
    }
}

編集:それでは、あなたはリフレクションを使って立ち往生していると思います。具体的な型に対してコードを記述できるようにする場合は、ジェネリックメソッドを作成し、リフレクションを使用して呼び出すことができます。

public class TestClass
{
    private static MethodInfo innerMethodDefinition =
        typeof(TestClass).GetMethod("InnerMethod");

    public void Method(object data)
    {
        var t = data.GetType();
        while (t != null &&
            !(t.IsGenericType &&
            t.GetGenericTypeDefinition() == typeof(BaseType<>)))
        {
            t = t.BaseType;
        }
        if (t != null &&
            t.GetGenericArguments()[0].IsAssignableFrom(data.GetType()))
        {
            innerMethodDefinition.MakeGenericMethod(
                t.GetGenericArguments()[0]).Invoke(this, new object[] { data });
        }
    }


    public void InnerMethod<TEntity>(TEntity data)
        where TEntity : BaseType<TEntity>
    {
        // Here you have the object with the correct type
    }
}
于 2010-07-22T11:51:52.773 に答える