在 C# 中以编程方式构建参数列表

Building parameter list programmatically in C#

*假设我有一个 class,其构造函数具有一个必需参数和三个可选参数。

public class myClass(int reqInt, string optStr1 = "st1", uint optUint1 = 0, float optFloat =0.0)
{ ... }

我知道,在我的调用代码中,我可以有效地将其视为重载函数,例如

myClass Foo = new myClass(1, "test");
myClass Foo2 = new myClass(2, "hellow world", 4);

甚至

myClass Foo3 = new myClass(3, optFloat : 4.5)

我想不通的是如何动态构建我的参数元组。例如。假设我的数据来自 JSON,我可能会得到以下数组:

[
 { "myInt" : "1"}, 
 {"myInt :"2", "myString" : "word"}, 
 {"myFloat" : "4.5", "myString" : "to" , "myInt" : "3"}, 
 {"myUInt" : "4", "myInt" "-4", "myFloat" : "4.4", "myString" : "yo!"}
]

我显然可以创建 8 个不同的调用者*,但这似乎只是将重载从构造函数转移到调用者。但是我不知道如何动态构建元组,尤其是使用命名 parameters/aliases,所以我只有 1 个调用函数。

数组列表似乎可以工作,但(我认为)我需要使用命名参数,因为在某些情况下我没有可选参数 1,但有 2 或 3(或任何组合)其中)。

这不可能是边缘情况,但我没有在我的搜索中找到任何有用的东西(我不使用 C#,或者大多数时候实际上使用任何强类型语言,所以请原谅我,如果这是一个非常基本的问题。

*意思是,假设我已经将我的 Json 反序列化为 myJson ,我可以这样做:

If(myJson.myString.hasValue){
   if(myJson.myString.hasValue){
      if(myJson.myUInt.hasValue){
         if(myJson.myFloat.hasValue){
            (int, string, uint, float) myParams = (reqint: myJson.myInt, optStr1: myJson.myString, optUint1: myJson.myUInt, optFloat: myJson.myFloat)
         } else if
...

依此类推,递归地构建出 8 种可能的情况。但这似乎真的很冗长...

您可以使用生成器

给定

public class MyClassBuilder
{
   public int reqInt { get; set; }
   public string optStr1 { get; set; } = "st1";
   public uint optUint1 { get; set; }
   public float optFloat { get; set; }
}

例子

public class MyClass
{
   public MyClass(MyClassBuilder builder) 
     : this(builder.reqInt, builder.optStr1, builder.optUint1, builder.optFloat)
   {

   }
   public MyClass(int reqInt, string optStr1 = "st1", uint optUint1 = 0, float optFloat = 0.0f)
   {

   }
}

用法

// Once you have deserialized to your builder, or set it somehow

var myClass = new MyClass(builder);

如果您的构造函数选项比这更复杂,您将不得不在构造函数中使用分支并手动填写字段。

实现此目的的另一种方法是按原样反序列化 MyClass。