Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 具有通用方法和属性的两个类_C#_.net_Class_Dynamic_Duck Typing - Fatal编程技术网

C# 具有通用方法和属性的两个类

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您可以检查对象是否属于特定类型,

我有两节课

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

您可以检查对象是否属于特定类型,然后强制转换它并调用其方法:

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");
}