在我陈述我的问题之前,让我提供一些关于我正在尝试做的事情的背景信息,因为也许有更好的方法来实现它。
我有一个类C
继承了两个接口A
和B
.
public interface A
{
void DoStuff();
}
public interface B
{
void DoStuff();
}
C 为DoStuff
.
void A.DoStuff()
{
Console.WriteLine("A");
}
void B.DoStuff()
{
Console.WriteLine("B");
}
我当然知道DoStuff
可以像下面这样调用。
var c = new C();
var a = (A)c;
a.DoStuff();
var b = (B)c;
b.DoStuff();
我想要做的是避免转换C
为A
or B
,然后DoStuff
调用A
or B
。
所以我的想法是我可以实现一个通用的方法来为我做这件事,所以我首先尝试这样。
public void DoStuff<T>()
{
var i = (T)this;
i.DoStuff();
}
当然,考虑到您可以转换this
为T
并导致编译器错误,这当然行不通,所以我的下一步是尝试创建一个静态方法,该方法通过实例this
然后在那里进行转换。
private static To ConvertToDoStuffInterface<From, To>(From from)
{
return (To)from;
}
我没想到会奏效,但值得一试。正如我所料,它会导致编译器错误,因为From
无法显式转换为To
.
我最后的手段是使用dynamic
关键字,当然它会顺利通过ConvertToDoStuffInterface
,但是一旦我尝试调用它,我有点怀疑它可能会DoStuff
抛出一个。RuntimeBinderException
我知道为什么会抛出异常,这当然是因为它无法将结果正确绑定ConvertToDoStuffInterface
到任何类型,并且我假设需要某种类型的转换。
这是dynamic
用法的代码。
private static dynamic ConvertToDoStuffInterface<T>(dynamic from)
{
return (T)from;
}
public void DoStuff<T>()
{
var i = ConvertToDoStuffInterface<T>(this);
i.DoStuff();
}
不过我的问题是,如果没有更好的方法可以使用泛型来实现这一点,或者dynamic
,我将如何进行从dynamic
to的转换T
?有没有一种方法可以检查传递的类型DoStuff<T>
是否有方法DoStuff
,然后允许我最初尝试的内容?
为了澄清我想要做的事情是这样的
var c = new C();
c.DoStuff<A>(); // Calls A.DoStuff()
c.DoStuff<B>(); // Calls B.DoStuff()
这是我的C
实现。
public class C : A, B
{
public void DoStuff<T>()
{
// ... DoStuff<T> implementation here ...
}
void A.DoStuff()
{
Console.WriteLine("A");
}
void B.DoStuff()
{
Console.WriteLine("B");
}
}