を
私が間違っていると.NETのより大きな専門家が私を修正できますが、これは可能ではないと私は考えています。内部的には、.NETフレームワークは実際にその階層を維持しておらず、ILコードにコンパイルされると平坦化されると私は考えています。
例えば、C#コード:それはILコードに組み込まれた後
class Program : I2
{
static void Main(string[] args)
{
}
}
interface I1
{
}
interface I2 : I1
{
}
、それは:正確class Program : I1, I2
同じである
.class private auto ansi beforefieldinit ReflectionTest.Program
extends [mscorlib]System.Object
implements ReflectionTest.I2,
ReflectionTest.I1
{
...
しかし、ILにおいても:
.class interface private abstract auto ansi ReflectionTest.I2
implements ReflectionTest.I1
{
...
これは、あなたは彼らが他人のものを実装するかどうかを確認するために、これらの各インターフェイスを照会し、その後、Program
クラスから(私の例から)I1
とI2
を得るために、いくつかのロジックを記述することができることを意味は...つまり typeof(I2).GetInterfaces()
はI1
が含まれているので、あなたはtypeof(Program).GetInterfaces()
戻りI1
とI2
いるので、その後、Program
が直接コードでI1
を継承していないかもしれないと推測することができます。
これも有効なC#のコードであり、同じILコードになるだろう(とも同じ反射の結果)ので、私はかもしれないを強調:今すぐ
class Program : I1, I2
{
static void Main(string[] args)
{
}
}
interface I1
{
}
interface I2 : I1
{
}
Program
両方の直接および間接的I1
を継承します。..
'public class Test:ITest、ITesting'の場合はどうなりますか?なぜこれが欲しいのですか? – SLaks
私はクラスが直接継承されているもののインタフェース知っていただきたいと思いますので?そして、ではないインターフェイスは、動的に新しい型を生成するために、間接的に継承されます。それはなぜ重要なのでしょうか? –
厳密に言えば、あなたは*インターフェースを継承せず、それらを実装するので、 'Test'クラスはこの場合に' ITest'と 'ITesting'の実装を提供しています。 「ITest」が「ITesting」から「継承」するという事実は、単に「ITest」を実装するどのタイプもITestingの実装を提供しなければならないことを単に意味する。 – LukeH