5

私は派生元の汎用抽象クラスを持っています:

abstract class SuperClass<T>
where T : SuperDataClass

abstract class SuperDataClass

データ型は SuperDataClass に制限されているため、すべての具体的なデータ型は SuperDataClass から継承する必要があります。最後に、SuperClass と SuperDataClass の継承者のペアがあります。

class DataClassA : SuperDataClass
class ClassA : SuperClass<DataClassA>

class DataClassB : SuperDataClass
class ClassB : SuperClass<DataClassB>

可能なデータ型を知らなくても、ClassA などのオブジェクトが SuperClass から継承されているかどうかを確認するにはどうすればよいですか?

次のことを試しましたが、うまくいきません。

if (testObject.GetType().IsAssignableFrom(typeof(SuperClass<SuperDataClass>))) {
    Console.WriteLine("The test object inherits from SuperClass");
}

では、if ステートメントはどのように見える必要があるのでしょうか。

4

4 に答える 4

1

この場合、明らかにすべての明白な解決策 ( IsSubclassOfIsAssignableFrom、) は機能しません。だから私は物事を少し強制しようとしましたが、クラスが であるかどうかをテストするこの方法を思い付きました:isasSuperClass<Something>

private bool IsSuperClassOfSomeKindOfSuperDataClass(Type type)
{
    if (!type.IsGenericType)
        return false;

    var gtd = type.GetGenericTypeDefinition();

    if (gtd != typeof(SuperClass<>))
        return false;

    var genericParameter = type.GetGenericArguments().First();

    return genericParameter.IsSubclassOf(typeof(SuperDataClass));
}

もちろん、これはクラスがから継承されているかどうかではなく、クラス であるかどうかをテストするため、次の明らかなステップは、適切なクラスのすべての継承階層をテストする関数を作成することです。SuperClass<Something> SuperClass<Something>

private bool InheritsFromSuperClassOfSomeKindOfSuperDataClass(Type type)
{
    while (type != typeof(Object))
    {
        if (IsSuperClassOfSomeKindOfSuperDataClass(type))
            return true;

        type = type.BaseType;
    }

    return false;
}

これらの関数を配置すると、探しているテストは次のようになります。

if (InheritsFromSuperClassOfSomeKindOfSuperDataClass(@object.GetType())) 
    // do stuff...
于 2013-08-07T09:16:15.120 に答える
1

IsSubclassOf関数をジェネリック型と組み合わせて使用​​します。

if (@object.GetType().IsGenericType &&
    @object.GetType().GetGenericTypeDefinition().IsSubclassOf(typeof(SuperClass<>))) {
    Console.WriteLine("The object inherits from SuperClass");
}

@object確認したいタイプはどこですか(質問から命名をコピーしましたが、オブジェクトはすべてのクラスのスーパークラスであるため、適切な名前ではありません)。

ジェネリック型パラメーターも確認したい場合は、使用します

if (@object.GetType().IsGenericType &&  
    @object.GetType().GenericTypeArguments[0].IsSubclassOf(typeof(SuperDataClass)) && 
    @object.GetType().IsSubclassOf(typeof(Superclass<>)))

編集:最後のコメント - ジェネリック型から派生した非ジェネリック型:

if (@object.GetType().IsSubclassOf(typeof(Superclass<>)))
于 2013-08-07T08:48:16.253 に答える
0

ここで、予想される型が何であるかについての手がかりが得られるはずです。したがって、この場合はType.IsSubclassOf Methodを使用します。

その使用例は、

Class1 myClass = new Class1();
DerivedC1 myDClass = new DerivedC1();
Type myClassType = myClass.GetType();
Type myDClassType = myDClass.GetType();

// Returns true.
bool isSubClass = myDClassType.IsSubclassOf(myClassType));

これが役立つことを願っています。

于 2013-08-07T08:51:06.283 に答える