【发布时间】:2015-11-12 11:53:51
【问题描述】:
我目前遇到以下问题:
我有一个包含 3 个不同字段的类
- 枚举 x
- ActiveDirectory 用户
- 自定义类 z
可以通过传递字符串或枚举对象来初始化枚举。 ADUser 可以通过传递字符串 (LoginName) 或用户本身来初始化,而 CustomClass 可以通过传递字符串、int 或对象来初始化。
现在我想初始化类以传递所有不同的组合,例如
class(string enumValue, string adUser, string customClass)
class(string enumValue, ADUser adUser, CustomClass customClass)
class(EnumValue enumValue, string adUser, CustomClass customClass)
有没有一种方法可以在不输入所有 12 种可能性的情况下简化构造函数 (Enum-2 * ADUser-2 * CClass-3 = 12)?
我想到了链式构造器,我最终也得到了 12 个构造器,但也考虑过只在每个参数上传递 c# 对象并对其进行强制转换并对其进行处理,但我认为这只是一个肮脏的解决方法?
编辑
该类包含在库中,因此可以在内部使用,也可以在公共使用。对于内部使用,传递对象的具体版本没有问题。
但是,如果我在其他解决方案中公开使用它,这些解决方案只能引用字符串或 int 值。因此,该类应该能够在初始化时“获取”这些值并转换它们,因为它可以访问所有真实对象。
也许这可以稍微澄清一下问题。
这里有一些改名的代码sn-ps:
#region Content of libraryOne
public class ClassName
{
internal EnumValueWrapper { get; set; }
internal CustomClass { get; set; }
internal ADUser { get; set; }
public ClassName() { ... } //Now via Builder Pattern
internal ClassName() { ... } //With Parameters for internal initialisations
public InformationContainer GetContentInfo()
{
//[...]Process Stuff and Return Container
}
}
internal CustomClass { ... }
internal EnumValueWrapper { ... }
internal ADUser { ... }
#endregion Content of libraryOne
【问题讨论】:
-
我建议不要允许除了初始化构造函数的对象的具体版本之外的任何内容。所以 class(EnumValue enumvalue, ADUser adUser, CustomClass customClass) 将是我唯一的构造函数。但是没有看到更多代码以及它是如何架构的,我不知道这是否可行。
-
JamesThorpe ADUser、EnumValue 和 CustomClass 都已预先初始化。该类应该从它可以访问的池中选择正确的一个。 DanielCasserly 我会更新一些架构信息
-
考虑在codereview.stackexchange.com 上提出这个问题,或者在那个网站上寻找类似的问题
-
您在错误的层面上解决了这个问题。尽可能添加隐式或显式转换,或者只是让调用者传递正确的类型。那么你只需要一个构造函数:
EnumValue, ADUser, CustomClass.
标签: c# constructor-overloading