bugfix> c# > 投稿

クラスがインターフェイスから直接継承するかどうかを知りたい。 Type.IsSubClass のようなものしかし、インターフェイス用。

にとって

interface IOne{}
class Zero{}
class One:IOne{}
class Two:One{}
class Three: Zero, IOne{}
type(Three).IsSubInterface(IOne)  //should return true
type(Two).IsSubInterface(IOne)    //should return false

私は Type.GetInterfaces で遊んでみましたType.BaseTypeが、SubInterfaceがクラスであるかどうかを取得する直接的な方法を見つけられませんでした。 typeof(IOne).IsAssignableFrom 継承のツリー全体をチェックしているため、私にとってはうまくいきませんが、ここではクラスがインターフェイスを直接継承するかどうかを確認したいだけです。

背後にある理由はefcoreにあり、 IAudit を継承するエンティティのみを監査します監査対象エンティティから継承するエンティティではなく、インターフェイス。

IAudit ではなく他のソリューション私は属性を作成することを考えていましたが、インターフェースでこれを解決できれば私の人生ははるかに楽になります

回答 1 件
  • これはあなたのために働きますか?

    using System;
    namespace Demo
    {
        interface IOne { }
        class Zero { }
        class One : IOne { }
        class Two : One { }
        class Three : Zero, IOne { }
        public static class TypeExt
        {
            public static bool IsSubInterface(this Type t1, Type t2)
            {
                if (!t2.IsAssignableFrom(t1))
                    return false;
                if (t1.BaseType == null)
                    return true;
                return !t2.IsAssignableFrom(t1.BaseType);
            }
        }
        class Program
        {
            static void Main()
            {
                Console.WriteLine(typeof(Three).IsSubInterface(typeof(IOne)));
                Console.WriteLine(typeof(Two).IsSubInterface(typeof(IOne)));
            }
        }
    }
    
    

    タイプが t2 を実装しない場合  答えは常に false です 。

    型に基本クラスはないが t2 を実装する場合  それは実装クラスでなければならないので、答えは本当です。

    タイプが t2 を実装する場合 、基本クラスがあり、その基本クラスは t2 を実装しません  答えは true です 。

    それ以外の場合、答えは偽です。

    これはすべての場合に機能するとは限りません。質問は次のとおりです:動作させたいケースで動作しますか?

    ただし、これが設計ルートであるかどうかはわかりません。それは少しハッキーなようです。上記の/ u/Damien_The_Unbelieverのコメントに同意します。

あなたの答え