C# 通过反射在类上调用多个泛型接口方法

C# 通过反射在类上调用多个泛型接口方法,c#,reflection,C#,Reflection,警告:虽然公认的答案是正确的,但对于任何试图实现此目的的人,请参阅@CodesInChaos的评论。这对我来说是个坏主意。 我有一个通用接口和一个实现接口“n”次数的类: interface IA<T> { T Foo(); } class Baz1 { } class Baz2 { } class Bar : IA<Baz1>, IA<Baz2> { Baz1 Foo() { return new Baz1(); } Baz2

警告:虽然公认的答案是正确的,但对于任何试图实现此目的的人,请参阅@CodesInChaos的评论。这对我来说是个坏主意。


我有一个通用接口和一个实现接口“n”次数的类:

interface IA<T>
{
    T Foo();
}

class Baz1 { }
class Baz2 { }

class Bar : IA<Baz1>, IA<Baz2>
{
    Baz1 Foo() { return new Baz1(); }
    Baz2 Foo() { return new Baz2(); }
}
定义:

interface IA<T>
{
    T Foo();
}

class Baz1 { }
class Baz2 { }

class Bar : IA<Baz1>, IA<Baz2>
{
    Baz2 IA<Baz2>.Foo()
    {
        return new Baz2(); 
    }

    Baz1 IA<Baz1>.Foo()
    {
        return new Baz1(); 
    }
}
接口IA
{
T Foo();
}
类Baz1{}
类Baz2{}
等级:IA,IA
{
Baz2 IA.Foo()
{
返回新的Baz2();
}
Baz1 IA.Foo()
{
返回新的Baz1();
}
}
代码:

Bar b=新的Bar();
var methods=typeof(Bar).GetInterfaces()。其中(i=>i.IsGenericType&&i.GetGenericTypeDefinition()==typeof(IA))。选择(i=>i.GetMethod(“Foo”);
foreach(方法中的var方法)
{
var invoked=method.Invoke(b,null);//或在需要时添加参数而不是null
}

在我的特定情况下,我没有使用
IA
,而是使用
Bar
类来实现
IObservable
IObservable
,以及
IObserver
IObserver
,等等,但我不想让讨论变得模糊不清。也许这是相关的?好吧,现在考虑一下,这实际上是相关的,因为
IObservable
用例(在
Baz
上调用两个不同的
Subscribe()
方法)与
IObserver
用例(调用两个不同的
Subscribe())是不同的
Baz
作为参数的方法)。因此,让我们考虑前者,就像我所提供的示例代码。您确定这里需要继承而不是合成吗?那么我将是直接的。你不应该那样做<代码>IObservable是协变的。因此,如果您为不同的
T
s实现它,返回不同的序列,您将无法获得
IObservable
的正确实现。关于实现两个独立版本的
IEnumerable
:1)2)谢谢,我忘记了必须明确实现。请注意,在
方法
中只能获得一个或零个元素,因此可能需要将
选择
替换为更合适的
第一个默认值
+检查。@YoryeNathan您可以获得多个
方法信息
对象,并且您将获得这些对象。您不能使用FirstOrDefault,因为它胜过puropse。一个显式接口方法的多个实现,是由同一个类实现的吗?但是,如果方法重载,则说明您是正确的。但如果已知该方法只有一个签名,我会选择
FirstOrDefault
interface IA<T>
{
    T Foo();
}

class Baz1 { }
class Baz2 { }

class Bar : IA<Baz1>, IA<Baz2>
{
    Baz2 IA<Baz2>.Foo()
    {
        return new Baz2(); 
    }

    Baz1 IA<Baz1>.Foo()
    {
        return new Baz1(); 
    }
}
    Bar b = new Bar();
    var methods = typeof(Bar).GetInterfaces().Where(i => i.IsGenericType && i.GetGenericTypeDefinition() == typeof(IA<>)).Select(i => i.GetMethod("Foo"));
    foreach(var method in methods)
    {
        var invoked = method.Invoke(b, null); // or add params instead of null when needed
    }