Сплаттинг в C# - PullRequest
       19

Сплаттинг в C#

3 голосов
/ 29 марта 2020

В PowerShell вы можете создать хеш-таблицу и добавить эту хеш-таблицу к своей функции с помощью @, то есть splatting в PowerShell.

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

Можно ли передать словарь как набор параметров конструктору или методу?

1 Ответ

2 голосов
/ 29 марта 2020

Если вы хотите поддерживать несколько значений типа в словаре, как в вашей таблице PowerShell Ha sh, вы можете создать 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 - это просто класс System.Object, определенный в. NET, от которого наследуются все типы. Вы можете проверить это в PowerShell с помощью $dict.GetType().BaseType.FullName, что даст вам System.Object.

Тем не менее, использование object, как показано выше, опасно, так как оно не обеспечивает безопасность типов и требует, чтобы вы приводили в object. Это также известно как Бокс и Распаковка . Было бы лучше использовать сильные типы здесь, если вы можете, или переосмыслить свой дизайн.

Учитывая вышесказанное, мы могли бы вместо этого использовать простой класс со строго типизированными атрибутами:

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