如何将一个方法传入另一个类中的方法的可选参数并调用?

HeyDear 2019-05-20 12:57:35
例如

class A
{
method1() //这是一个方法


method2()//通过此方法传递method1
{
classB.method(method1)
}
}


class B
{
method(params object[] args) //method1传入 然后调用
{
args[0] 怎么调用????
}
}

我试过委托 但是这样总要在A中声明委托 在B中也要声明委托 现在的要求是 (params object[] args) 不可能改为其他 最好也不要在A中声明委托来传递 因为不只有A去调用B的方法,不能每个调用B的类都再新建立一个委托

求助各位大哥!!

...全文
396 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
bloodish 2019-05-22
  • 打赏
  • 举报
回复
扩展一下,能理解多少看楼主能力,不需要额外的委托定义

class A
        {
            void method1() { } //这是一个方法

            int method3(int p) => 0;

            void method2()//通过此方法传递method1
            {
                B b = new B();
                b.method(new Action(method1));
                b.method(new Func<int,int>(method3),1);
            }
        }


        class B
        {
            public void method(params object[] args) //method1传入 然后调用
            {
                if (args?.Length > 0 && args[0] is Delegate del)
                {
                    if(args.Length > 1)
                    {
                        del.DynamicInvoke(args[1]);
                    }
                    else
                    {
                        del.DynamicInvoke(null);
                    }
                   
                }
            }
        }
Eagle Liang 2019-05-20
  • 打赏
  • 举报
回复

    public class A
    {
        /// <summary>
        /// 被调用的方法
        /// </summary>
        private void MethodA()
        {
            Console.WriteLine("MethodA");
        }
        /// <summary>
        /// 给B传入方法
        /// </summary>
        public void MethodB()
        {
            B.RunMethod run = MethodA;
            var b = new B();
            b.Method(run);
        }
    }

    public class B
    {
        /// <summary>
        /// 声明委托
        /// </summary>
        public delegate void RunMethod();
        /// <summary>
        /// 执行的方法
        /// </summary>
        /// <param name="args"></param>
        public void Method(params object[] args)
        {
            // 假设第一个参数就是委托就执行委托的内容
            if (args != null && args[0] != null && args[0] is RunMethod)
            {
                (args[0] as RunMethod)();
            }
        }
    }
游北亮 2019-05-20
  • 打赏
  • 举报
回复
楼上的方法不是静态的,会抛异常,换成这个:

        static void aaa()
        {
            Console.WriteLine("aaa");
        }
        static void bbb(params object[] obj)
        {
            foreach (object o in obj)
            {
                if (o is Delegate)
                {
                    ((Delegate) o).Method.Invoke(null, null);
                }
            }
        }

        static void Main(string[] args)
        {
            Action a = aaa;
            bbb(a, a);
            Console.ReadLine();
}
游北亮 2019-05-20
  • 打赏
  • 举报
回复
参考代码,不需要修改旧的方法:

static void bbb(params object[] obj)
{
    foreach (object o in obj)
    {
        if (o is Delegate)
        {
            ((Delegate) o).Method.Invoke(null, null);
        }
    }
}

static void Main(string[] args)
{
    Action a = ()=> {
        Console.WriteLine("aaa");
    };
    bbb(a, a);
    Console.ReadLine();
}
qq_24062975 2019-05-20
  • 打赏
  • 举报
回复
用委托的方法,就一个类里面申请委托类型,另外一个类里面定义委托方法吧
正怒月神 2019-05-20
  • 打赏
  • 举报
回复
static void Main(string[] args)
        {
            B.TestB(A.TestA, 1,2,3,"hello");

            Console.ReadLine();
        }


        public class A
        {
            public static void TestA(object[] t)
            {
                Console.WriteLine(string.Join(",",t));
            }
        }

        public class B
        {
            public static void TestB(Action<object[]> a, params object[] args)
            {
                a(args);
            }
        }
HeyDear 2019-05-20
  • 打赏
  • 举报
回复
引用 4 楼 娃都会打酱油了 的回复:
委托不知道吗?
A类不声明委托 只想传入一个方法给params object[] args ,现在提示不能将方法组转换为object
  • 打赏
  • 举报
回复
你这种问题不就是委托+方法重载吗?
class B
{
    method(params object[] args) //method1传入 然后调用
{
   args[0] 怎么调用????
}

method(Func func,params object[] args)
{
}
}
  • 打赏
  • 举报
回复
委托不知道吗?
HeyDear 2019-05-20
  • 打赏
  • 举报
回复
引用 1 楼 把分全给哥 的回复:
A类里不用声明
那方法怎么样传入可选参数呢?
OrdinaryCoder 2019-05-20
  • 打赏
  • 举报
回复
静态方法了解一下
把分全给哥 2019-05-20
  • 打赏
  • 举报
回复
A类里不用声明

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧