class Base
class A : Basefn(Base A)
fn(A a)Base base = new A();
fn(base); //调用的是fn(Base A)怎么让它调用fn(A a)
不要if或者switch的

解决方案 »

  1.   

    看来我说的不够明白,题目重写一下(竟然不许编辑)
    class Base
    class A1 : Base
    ...
    class An : Basefn(Base A)
    fn(A1 a)
    ...
    fn(An a)Base base = new An();
    fn(base); //调用的是fn(Base A)怎么让它调用fn(An a)
    不要if或者switch的
    =========================================
    1,2楼没有实时性 写死的
    3楼的方法我试过几种,无法达到效果,能不能说明确些。
      

  2.   

    没有的话
    Base base = new An();
    fn(base); //无法编译通过
      

  3.   

    你还没明白吗?
    Base base = new An();
    这个你用一个基类变量来做操作,那么后续的操作就应该是对基类的操作,但是你后面的需求又是对子类的操作,你这种设计本身就是有矛盾的。
      

  4.   

    那这样吧
    var base = new An();
    fn(base);
      

  5.   

    我当然明白
    我现在用switch实现的选择
    switch写的我烦了
    我想知道c#中有什么好办法么,要不然重载没什意义,还不如fnA1()...fnAn()更明确些
      

  6.   

    这样的写法和
    An base = new An();
    是没有一点区别的。
      

  7.   

    倒是可以
    typeof(base)获得An的Type
    以后就不知道怎么做了
      

  8.   

    12楼的办法仅限 这样
    var base = new An();
    fn(base);
    这样不行
    Base b = new An();
    var base = b;
    fn(base);
    这不是我想要的
      

  9.   

    ((dynamic)this).fn(base);
    C# 4.0限定
      

  10.   

    为什么非得用
    Base b = new An();
    去构建对象呢?
      

  11.   

    16楼 4.0限定的没法了 本人3.5
    17楼 这只是个比喻,现在的情况可能更像窗体事件函数的参数 object sender 可能你就明白了
      

  12.   

    唉,给你写吧:using System;namespace ConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {
                Base b = new A();
                fn((A)b);
                Console.ReadKey();
            }
            private static void fn(Base a)
            {
                Console.WriteLine("Base");
            }        private static void fn(A a)
            {
                Console.WriteLine("A");
            }    }    class Base
        {
        }    class A : Base
        {
        }}
    在你的问题中先写明这种代码,不累。
      

  13.   


    提问题最好是直截了当地写出你的“object sender”,而不需要先过分总结和掩盖具体程序。
      

  14.   

    “实时性”?你发明的这个词儿跟你的问题描述自相矛盾。你在描述问题是说是“让他调用fn(A a)”,然后又说自己这种脑袋所能说出的意思是“没有实时性”的,这不就是自相矛盾了嘛!你自己都是自相矛盾的,所说的话根本是前后不一致,觉得还有希望别人给你写出什么“万能”的代码能够解决你根本说不清需求的问题吗?
      

  15.   

    用泛型吧 fun<T>(T A) where T:Base
    fun<A>(A)
    fun<An>(A)
      

  16.   

    LZ需要的,是运行时的重载决策。在没有实现DLR的C# 3.5,只能用反射。
    但是既然需要运行时的多态,为什么不考虑3L的方案——重写?
    在基类中定义虚方法fn,然后各子类重写这个方法就好了嘛。
      

  17.   

    与其说想获得帮助,我更想发起讨论,但是由于言不达意使大家没明白我的意思,也没达到我想要的结果。
    在整个程序中,我就用if写了这么个“分发函数”(函数名也定义为分发),前面的调用和后面的处理都不归我管。由于派生类有十几个觉得这么处理挺笨的,所以讨论看看有什么“聪明的”办法。我也对后面处理成重载函数有异议,后来想想可能是这么写函数定义时方便。21楼:一排排的else if也没什么好贴的,所以自己简化了贴上来。
    22楼:我并不想要什么“万能代码”,但却想知道是不是有像类中虚函数那样的“实时的”选择调用
      

  18.   

    class Base
    class A1 : Base
    ...
    class An : Basefun<T>(T arg) where T:Basefun<Base>(a)
    fun<A1>(a)
    ...
    fun<An>(a)
      

  19.   

    24楼:3楼的方案我试过了,但由于改动量和范围问题,不可能。反射会有用么因为GetMethod的时候还是要用字符串指明的。而且反射能用在这种情况么,我只在需要dll文件时用过。我不想指指点点别人写的好坏,只是要对一个基类引用的派生类实例处理,并且这种处理又需要派生类特有的属性或方法时,我只想到多重选择转换没有别的。所以才发了这贴想和大家讨论一下有没有更好的办法。
      

  20.   


    我觉得泛型在这用不上
    ……
    else if 是An么
    fn((An)a);
    ……

    ……
    else if 是An么
    fn<An>(a);
    ……
    对我来说没啥区别。如果尖括号中的类可以用Type类的实例代替那就好了。
      

  21.   

    Microsoft.VisualBasic.Interaction.CallByName(提供fn的对象实例,"fn",1,a)记得引用Microsoft.VisualBasic.dll