有没有办法在C#中做这样的事情?

Alo*_*kin 10 c# parameters

有没有办法在C#中做这样的事情?

public void DoSomething(string parameterA, int parameterB)
{

}

var parameters = ("someValue", 5);
DoSomething(parameters);
Run Code Online (Sandbox Code Playgroud)

Jam*_*iec 21

关闭,但不幸只使用对象(所以你得到很多拳击/拆箱)

public void DoSomething(params object[] parameters)
{

}

var parameters = new object[]{"someValue", 5};
DoSomething(parameters); // this way works
DoSomething("someValue", 5); // so does this way
Run Code Online (Sandbox Code Playgroud)


Eri*_*ert 14

不是今天,不是.我们目前正在为可能的假设未来版本的C#进行原型设计.

如果你能提供一个真正令人敬畏的理由,为什么你想要这个功能,这将是实际上从原型开始到可能的假设未来版本.什么是你激动这个功能的令人敬畏的场景?

(请记住,Eric对C#可能假设的未来版本的猜测仅用于娱乐目的,不应被解释为承诺将会有这样的版本,或者它将具有任何特定的功能集.)


spe*_*der 10

如果您第一次存储为委托,则无需使用反射,但它确实需要强大的委托声明.

public void DoSomething(string parameterA, int parameterB)
{
    Console.WriteLine(parameterA+" : "+parameterB);
}
void Main()
{

    var parameters = new object[]{"someValue", 5};
    Action<string,int> func=DoSomething;
    func.DynamicInvoke(parameters);

}
Run Code Online (Sandbox Code Playgroud)

...并且您可以忘记参数列表的编译时类型/健全性检查.可能是一件坏事.


ang*_*son 8

你可以通过反射来调用它,但这会产生一些开销:

using System;
using System.Reflection;

namespace SO2744885
{
    class Program
    {
        public void DoSomething(string parameterA, int parameterB)
        {
            Console.Out.WriteLine(parameterA + ": " + parameterB);
        }

        static void Main(string[] args)
        {
            var parameters = new object[] { "someValue", 5 };
            Program p = new Program();
            MethodInfo mi = typeof(Program).GetMethod("DoSomething");
            mi.Invoke(p, parameters);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

当然,如果您可以更改方法签名以获取数组,那么它也会起作用,但在我看来这看起来会更糟糕.

  • 难道你不能只做`Action <string,int> m = p.DoSomething; m.DynamicInvoke(参数);`? (2认同)