【问题标题】:Building parameter list programmatically in C#在 C# 中以编程方式构建参数列表
【发布时间】:2021-01-09 23:48:58
【问题描述】:

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

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 个不同的调用者*,但这似乎只是将重载从构造函数转移到调用者。但是我不知道如何动态构建元组,尤其是使用命名参数/别名,所以我只有 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 种可能的情况。但这似乎真的很冗长......

【问题讨论】:

  • 也许这个有用? params

标签: c# constructor optional-parameters


【解决方案1】:

你可以使用构建器

给定

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。

【讨论】:

  • 谢谢!您是否有理由为构建器中的字符串分配了默认值,而不是其他可选值?
猜你喜欢
  • 2013-04-03
  • 1970-01-01
  • 2014-07-28
  • 1970-01-01
  • 2011-09-24
  • 1970-01-01
  • 2013-01-02
  • 1970-01-01
  • 2015-10-09
相关资源
最近更新 更多