【问题标题】:Splatting in C#在 C# 中喷溅
【发布时间】:2020-03-29 15:23:55
【问题描述】:

在 PowerShell 中,您可以创建一个哈希表并使用 @ 将此哈希表添加到您的函数中,这在 PowerShell 中是 splatting

$dict = @{param1 = 'test'; param2 = 12}
Get-Info @dict

可以将字典作为参数集合传递给构造函数或方法吗?

【问题讨论】:

  • 您可以创建Dictionary<TKey,TValue> 实例,然后将其传递给方法
  • @PavelAnikhouski,但它们必须具有相同的类型,对吧?在我的示例中,有一个字符串和一个整数。这在 C# 中是不可能的,或者?
  • @Alex_P 字典可以有不同的类型,例如字典

标签: c# powershell dictionary parameter-splatting


【解决方案1】:

如果您想在字典中支持多个类型值,类似于您的 PowerShell 哈希表,您可以在此处创建 Dictionary<string, object>

var dict1 = new Dictionary<string, object>
{
    {"param1", "test"},
    {"param2", 12},
}

然后可以将其传递给构造函数:

private Dictionary<string, object> _dict;

public MyConstructor(Dictionary<string, object> dict)
{
    _dict = dict
}

object 类型只是 .NET 中定义的 System.Object 类,所有类型都继承自该类。您可以在 PowerShell 中使用$dict.GetType().BaseType.FullName 进行检查,这将为您提供System.Object

但是,如上所示使用object 是危险的,因为它不提供类型安全性,并且需要您在object 之间进行转换。这也称为Boxing and Unboxing。如果可以的话,最好在这里使用强类型,或者重新考虑你的设计。

考虑到上述情况,我们可以在这里使用简单的类来代替强类型属性:

public class MyClass {
    public string Param1 { get; set; }
    public int Param2 { get; set; }
}

然后你可以像这样初始化它:

var myObject = new MyClass
{
    Param1 = "test1",
    Param2 = 12
};

并传递给你的构造函数:

private MyClass _myObject;

public MyConstructor(MyClass myObject)
{
    _myObject = myObject;
}

【讨论】:

  • 在这种情况下,构造函数会将字典作为参数 - 值输入?
  • @Alex_P 是的。我可能会选择第二个选项,只使用一个类。然后你可以使用强类型成员,而不必担心object
  • 太好了。我没想过上课。我会试试看!非常感谢。
猜你喜欢
  • 2013-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-29
  • 2018-11-21
  • 2018-05-22
  • 1970-01-01
  • 2016-10-31
相关资源
最近更新 更多