現在のコード (ほとんど公開されていない、プロパティではなくフィールドなど) を使用すると、次のようなことができます。
var type = typeof(Test);
var interfaces = type.GetInterfaces().ToList();
interfaces.AddRange(type.GetFields(BindingFlags.NonPublic|BindingFlags.Instance)
.SelectMany(x => x.FieldType.GetInterfaces()));
これは のインターフェイスを取得しませんpublic int var1
。公開されているためです。
これはおそらくあなたの正確なニーズに合わないでしょうが、実際のコードと実際に期待される結果がなければ、より良い答えを出すことは非常に困難です.
編集
再帰とサンプルを使用して、コンソール アプリで:
private static void Main()
{
var type = typeof(Test);
var interfaces = type.GetInterfaces().ToList();
GetRecursiveInterfaces(type, ref interfaces);
}
private static IList<Type> GetFieldsType(Type type)
{
return type.GetFields(BindingFlags.NonPublic | BindingFlags.Instance).Select(m => m.FieldType).ToList();
}
private static void GetRecursiveInterfaces(Type type, ref List<Type> interfaces)
{
foreach (var innerType in GetFieldsType(type))
{
interfaces.AddRange(innerType.IsInterface
? new[] { innerType }
: innerType.GetInterfaces());
GetRecursiveInterfaces(innerType, ref interfaces);
}
}