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

标签 c# .net

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

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

我想在我的模板中使用对象/属性名称来替换我的“对象”参数中任何对象的实际属性值。假设我用以下方法调用此方法:

ParamsTest("Congrats", customer, purchase);

我将只能检索两个试图填写模板的参数名称,即 template , 和 objects ,以及 objects 中对象的名称收藏是否永远丢失?

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

最佳答案

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

但是这确实有缺点:

  • 没有类型安全。我可以传入任何对象
  • 我可以传入一个匿名类型,其成员和/或类型与预期的不同
  • 你还应该比这个简短的示例做更多的检查

关于c# - 如何将可变数量的命名参数传递给方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3383397/

相关文章:

c# - 如何丢弃文件之间的 Git 更改

c# - 框架代码 : Fail silently or throw exceptions

asp.net - ASP.NET Web应用程序(.NET Framework)与ASP.NET Core Web应用程序(.NET Framework)

c# - 使用 wsdl.exe 从 c# 客户端到 Tomcat 的 HTTPS 连接

c# - 来自不同键盘 C# .Net 的 RawInput

c# - 使用性能计数器计算平均值

c# - 测试文本框文本是否已完成文本更改时使用的最佳方法/事件是什么

c# - 从部分 View 中的表单发布 - 为什么会触发错误的 Controller 操作?

.net - .Net 是否有任何内置常量用于常见数字,如百万、十亿等?

c# - 运行单元测试时更改 app.config