我理解如何获取传递给方法的参数名称,但是假设我有一个方法声明如下:
static void ParamsTest(string template, params object[] objects)
我希望在我的模板中使用对象/属性名称替换我的`objects'参数中的任何对象中的属性值。那么我们就说这个方法叫做:
ParamsTest("Congrats", customer, purchase);
我只能检索两个试图填写模板的参数名称,即template
和objects
,objects
集合中的对象名称是永远失去了,不是吗?
我可能需要List<object>
作为我的第二个参数,但我觉得有一个更优雅的解决方案,可能有一个lambda或其他东西。我不知道,我不习惯在LINQ之外使用lambdas。
答案 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 });