gpt4 book ai didi

c# - 传递和执行具有不同参数签名的函数

转载 作者:行者123 更新时间:2023-11-30 20:41:23 25 4
gpt4 key购买 nike

我正在尝试以一种合理的通用方式构造一些对象。有些对象有构造函数参数,有些则没有。

我想要实现的是返回某种构建器函数,如果需要,我可以向其提供构造函数参数。

我知道我可以向下传递可选参数,但在我的真实场景中,有多个层,我不愿意在层次结构中添加可选参数。

我不太喜欢部分应用程序/柯里化(Currying),但我可以在这里使用它吗?如果可以,如何使用?

这里有一些示例代码 - 它不会工作 - 试图解释更多我所追求的。

public void Main()
{
dynamic buildClass = ClassBuilder<BaseClass>(true);
// ideally I'd like to be able to supply the constructor data
// here
var theClass = buildClass(???)

}

public Func<???, TClass> ClassBuilder<TClass>(bool flag) where TClass : BaseClass
{
// obviously this won't work since the delegates have different
// signatures
if (flag) return () => GetClassA();
return (x) => GetClassB(x);
}


public object GetClassA()
{
return new ClassA();
}

public object GetClassB(string param)
{
return new ClassB(param);
}

public class BaseClass {}

public class ClassA : BaseClass {}

public class ClassB : BaseClass
{
private string _param;
public ClassB(string param)
{
_param = param;
}
}

非常感谢

小号

最佳答案

要详细说明@Sylwekqaz,您可以使用如下所示的内容,并且不限制自己的 BaseClass 类型。

public static class Builder
{
public static T Build<T>(params object[] args) where T : class
{
var info = typeof(T).GetConstructor(args.Select(arg => arg.GetType()).ToArray());
if (info == null)
throw new ArgumentException(@"Can't get constructor :(", "args");

return (T)info.Invoke(args.ToArray());
}
}

然后您可以将构建器称为

var a = Builder.Build<ClassA>();
var b = Builder.Build<ClassB>(); // need parameterless ctor in ClassB
var c = Builder.Build<ClassB>("param");

关于c# - 传递和执行具有不同参数签名的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32394479/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com