1

私は次のようなクラスを持っています:

class A<T>
{

}

上記のクラスから派生した別のクラスがあります:

class B : A<X>
{

}

Xの上には別のクラスがあります。

今では B のような多くのクラスを持つことができ、それらのクラスでは、ジェネリック パラメーターは他のクラスである可能性があります。

B のようなクラスのインスタンスがクラス A から派生しているかどうかを確認するにはどうすればよいですか?

私は試した:

if objB.GetType() is typeof(A<object>) //didn't work, gave false

if objB.GetType() == typeof(A<object>) //didn't work, gave false

if typeof(A<object>).IsAssignableFrom(obj.GetType()) //didn't work, gave false

どうやってするの ?

4

3 に答える 3

1

質問を少し誤解しました...その状況で私がすることは次のとおりです-ただし、以下のサンプルは1レベルの深さでしか機能しないことに注意してください。他のオブジェクトが B から派生する可能性があると考えている場合、または知っている場合は、BaseType がオブジェクトになるまでループし、現在の型名を使用します。または、B から派生できないように封印することもできます。

    public class A<T>
    {

    }

    public class X
    {

    }

    public class B : A<X>
    {


    }


    void Test()
    {
        B obj = new B();

        if(b.GetType().BaseType.Name == "A`1")
        {
            Consosle.WriteLine(true);
        }
    }
于 2013-03-06T13:47:53.717 に答える
1

それは問題です。IsAssignableFromあなたがすでに知っていない限り、そこではテストは機能しませんX。あなたは次のようなことをしなければならないでしょう:

static bool IsA(Type type) {
    do {
        type = type.BaseType;
        if(type.IsGenericType && type.GetGenericTypeDefinition() == typeof(A<>))
           return true;
    } while(type != null && type != typeof(object));
    return false;
}

または、次のものも取得しTます。

static bool IsA(Type type, out Type t)
{
    do
    {
        type = type.BaseType;
        if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(A<>))
        {
            t = type.GetGenericArguments()[0];
            return true;
        }
    } while (type != null && type != typeof(object));
    t = null;
    return false;
}
于 2013-03-06T13:48:36.337 に答える
0

ああ、ここにあなたのためのいくつかの純粋な悪があります...dynamic反射を乗っ取るために悪用します。ここでの重要なポイントdynamicは、型ベースのキャッシュが組み込まれているため、毎回 (型ごとに 1 回だけ) 面倒な作業を行うことはありません。

static void Main()
{
    Console.WriteLine(IsA("abc"));   // False
    Console.WriteLine(IsA(new B())); // True
    Console.WriteLine(IsA(123));     // False
    Console.WriteLine(IsA(new D())); // True - where D : B
}
public static bool IsA(object o)
{
    return (bool)EvilOnlyUseDynamicToCallThis((dynamic)o);
}

private static bool EvilOnlyUseDynamicToCallThis(object o)
{
    return false;
}
private static bool EvilOnlyUseDynamicToCallThis<T>(A<T> a)
{
    return true;
}
于 2013-03-06T14:05:18.423 に答える