如何将可变数量的命名参数传递给方法?

时间:2010-08-01 19:20:04

标签: c# .net

我理解如何获取传递给方法的参数名称,但是假设我有一个方法声明如下:

static void ParamsTest(string template, params object[] objects)

我希望在我的模板中使用对象/属性名称替换我的`objects'参数中的任何对象中的属性值。那么我们就说这个方法叫做:

ParamsTest("Congrats", customer, purchase);

我只能检索两个试图填写模板的参数名称,即templateobjectsobjects集合中的对象名称是永远失去了,不是吗?

我可能需要List<object>作为我的第二个参数,但我觉得有一个更优雅的解决方案,可能有一个lambda或其他东西。我不知道,我不习惯在LINQ之外使用lambdas。

3 个答案:

答案 0 :(得分:5)

Mark马克我可以提供一个匿名类型的答案:

using System;

namespace ConsoleApplication5
{
    class Program
    {
        static void Main(string[] args)
        {
            ParamsTest(new { A = "a", B = "b"});
        }

        public static void ParamsTest(object o)
        {
            if (o == null)
            {
                throw new ArgumentNullException();
            }
            var t = o.GetType();
            var aValue = t.GetProperty("A").GetValue(o, null);
            var bValue = t.GetProperty("B").GetValue(o, null);
        }
    }
}

然而,这有缺点:

  • 没有类型安全。我可以传递任何对象
  • 我可以使用与预期不同的成员和/或类型传递匿名类型
  • 您还应该进行比此简短样本更多的检查

答案 1 :(得分:0)

您可以定义参数对象:

public class ParamsTestParams {
    public string A { get; set; }
    public string B { get; set; }

    public static readonly ParamsTestParams Empty = new ParamsTestParams();
}

将方法签名更改为:

ParamsTest(ParamsTestParams parameters)

然后像这样调用你的方法:

ParamsTest(new ParamsTestParams { A = "abc" });

或:

ParamsTest(new ParamsTestParams { B = "abc" });

或:

ParamsTest(new ParamsTestParams { A = "abc", B = "xyz" });

或:

ParamsTest(ParamsTestParams.Empty); // instead of null so you don't have to do null checks in the method's body

等等。

答案 2 :(得分:0)

我可能会这样做:

static void ParamsTest(string template, object[] objects)

并将其称为:

ParamsTest("Congrats", new object[] { customer, purchase });