在 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。
*假设我有一个 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。