C# 具有通用方法和属性的两个类
我有两节课 A类:C# 具有通用方法和属性的两个类,c#,.net,class,dynamic,duck-typing,C#,.net,Class,Dynamic,Duck Typing,我有两节课 A类: class A() { public void QQ() {} public void WW() {} } B类: class B() { public void QQ() {} public void WW() {} } 它们不共享相同的接口或抽象类。 A和B有两个不同的等级,我现在不能改变这一点 我想写一个适用于a和B的程序,并使用QQ和WW方法 我可以这样做吗?你能推荐一些我可以研究的文件吗 Tanks您可以检查对象是否属于特定类型,
class A() {
public void QQ() {}
public void WW() {}
}
B类:
class B() {
public void QQ() {}
public void WW() {}
}
它们不共享相同的接口或抽象类。 A和B有两个不同的等级,我现在不能改变这一点 我想写一个适用于a和B的程序,并使用QQ和WW方法 我可以这样做吗?你能推荐一些我可以研究的文件吗
Tanks您可以检查对象是否属于特定类型,然后强制转换它并调用其方法:
void InvokeQQ(object o){
if(o is A)
(o as A).QQ();
if(o is B)
(o as B).QQ();
}
在C#6中,您可以将其简化为
void InvokeQQ(object o){
(o as A)?.QQ();
(o as B)?.QQ();
}
这就是所谓的
你可以使用动力学
void Foo(dynamic dy)
{
dy.QQ();
}
也可以使用反射。()
你不能创建一个父类并将这些方法放在其中,然后让a和B从该类继承吗?你可以使用一个delegates它非常类似于动态类型“它们不共享同一个接口”-是的,目前没有它们都实现的
接口。然而,他们显然有一些共同之处。因此,定义一个接口ICanQQAndWW
,并让它们都实现它。既然已经有了一个显而易见的干净方法,为什么还要搜索一个丑陋的黑客呢?谢谢大家!我学到了一些新的和不同的方法。这不是一个单一的方法。这是两种方法的结合。使用这种方法,您可以将世界上所有的方法组合到一个方法中。在c#6中,它可以简化为(o as A)?.QQ()
@M.kazemAkhgary谢谢,我更新了答案。如果我们有500个类使用相同的QQ()
方法呢?为什么你认为使用对象是类型安全的,而使用动态不是?这忽略了对象dy可能没有QQ方法的事实,这将导致运行时错误。@Domysee我认为这比在您的approach@IvanStoev什么意思?如果没有类型应用,总是有可能抛出异常。亲爱的Downvoter。是否要注释?@Domysee我的意思是,如果您不识别传递的对象类型,则您的方法不会执行任何操作,从而对调用方隐藏该事实。它真的应该抛出异常,这将使它类似于这种方法,但不是那么灵活。这个答案肯定更好+1“A和B有两个不同的等级,我现在不能改变。”你能更详细地解释一下你的问题吗?比如,你想从Main中的某个方法或某个地方同时调用这两个方法吗?我有两个方法相同的类。第一个是生产类,第二个是测试环境类。我知道这很荒谬。我必须编写一个在生产环境和测试环境中都能工作的代码,并且必须使用这些类。
public static void CallQQ(object o)
{
var qq = o.GetType().GetMethod("QQ");
if (qq != null)
qq.Invoke(o, new object[] { });
else
throw new InvalidOperationException("method not found");
}