2010-08-01 77 views
5

我知道如何得到传递给方法的参数名称,但让我们说我有一个方法声明如下:如何将可变数量的命名参数传递给方法?

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

,我想在我的模板使用对象/属性名称与实际替代我的`对象'参数中任何对象的属性值。那么,让我们说我调用这个方法:

ParamsTest("Congrats", customer, purchase); 

我只能检索双参数名试图填写模板,即,template,并且objects,和对象的名称objects集合是永远失去了,还是不是?

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

+1

在怎么样了'解释通',其中的字符串是变量的名称? – Oded 2010-08-01 19:22:57

+0

+1。可以以某种方式使用C#4的实际命名参数? 'ParamTest(客户:客户,购买:购买)' – mpen 2010-08-01 19:29:57

+0

嗅探:-(我不能使用C#4。 – ProfK 2010-08-01 19:39:21

回答

5

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

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

但是这有缺点:

  • 没有类型安全。我可以传递任何对象
  • 我可以匿名类型具有不同的成员和/或类型比预期
  • 你也应该做更多的检查比这个简短的样本
+0

你也可以在通话中重新排序参数:) – 2010-08-01 19:41:49

+1

对我来说+1,哈哈。 – mpen 2010-08-01 19:55:53

+0

我希望我也可以选择标记,但他不是一个答案。谢谢,这是我选择的路线。 – ProfK 2010-08-01 22:18:12

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 

等。

+1

可以在c#中使用匿名对象4 – mpen 2010-08-01 19:26:50

+0

是的,但是在ParamsTest中获取其成员及其名称不是一项简单的任务 - 它涉及反射 – 2010-08-01 19:28:47

+0

添加匿名类型示例 – 2010-08-01 19:38:27

0

我可能只是做这样的:

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

,并调用它像这样:

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

就像我在匿名类型的示例中一样,您没有真正的类型安全性,也没有参数命名。 另外,从“new object [] {...}”到“new [] {...}”的语法可以更短“ – 2010-08-01 19:39:22

+0

我真的很需要参数命名。 – ProfK 2010-08-01 19:41:45

+0

然后我觉得Oded的字典的建议是你最简单的选择 – snurre 2010-08-01 20:00:35

相关问题