我遇到了一个有趣的问题,到目前为止,我还没有找到一个令人信服的好答案。
假设我在表单上有一个单选按钮,三个选项是:
- 出生日期
- sibling 人数
- 姓名
当您将它们实现为单选按钮时,您只能指定三个中的一个。
现在想象一下,我实际上也希望指定值。所以我的表格看起来像这样:
- 出生日期:yyyy/mm/dd
- sibling 数:nn
- 姓名:某某
所以,如果我选择单选按钮“出生日期”,那么我就可以输入日期时间作为值,但如果我选择姓名,那么我需要一个字符串,并且唉,如果我想选择 sibling 的数量,那么我需要一个整数作为值。
我不认为这在表单设计上有什么特别的突破。
有趣的问题是,我到底如何使用 C# 代码来做到这一点。让我解释一下。
我有一个方法,它接受一个“PersonalityTrait”类型的对象。然而,这个 PersonalityTrait 对象只能设置三个属性之一,或者它有出生日期,或者它有多个 sibling ,或者它有一个名字。它不能包含 2 个或更多属性。我到底如何确保它只包含三个属性之一??
我考虑过将此任务留给任何使用此对象来检查它是否具有多个属性集的代码,但我不确定该任务是否应留给调用代码。它只是违背了 DRY(不要重复自己)原则。另外,我不相信调用代码会如此警惕。
我考虑过在该 PersonalityTrait 对象上创建一个方法来验证它(通过检查是否只设置了一个属性),但同样,我不确定调用代码是否会调用它。
我考虑过更改 SET 属性方法代码以首先实际检查其他属性,如果已经设置了其他属性则抛出异常,但这感觉就像在表单上提供 list 而不是单选按钮并在以下情况下抛出异常用户选择了多个选项(这对用户来说只是不直观!!)。
如果这只是一个字段,我会创建一个枚举并将其设为三个选项之一(生日、 sibling 人数或姓名),但问题是,我还想接受一个 VALUE,而且我想该值是强类型的。
这似乎是 Jon-Skeet 类型的问题,大声笑,我可能需要复习“深入了解 C#”才能弄清楚这个问题。但我想我现在应该把它发布到 StackOverFlow 上!!
最佳答案
这个问题缺少的是需要将容器作为参数传递给方法(我认识发帖者并与他讨论过这个问题)。
我喜欢泛型的想法。我在想这样的事情:
class Program
{
static void Main(string[] args)
{
var param = new Container<int>(){ Name = "Age", Value = 60};
Test(param);
}
public static void Test<TType>(Container<TType> container)
{
Console.Write(string.Format("{0} = {1}", container.Name, container.Value));
Console.ReadLine();
}
}
public class Container<TType>
{
public string Name { get; set; }
public TType Value { get; set; }
}
我不喜欢神奇的字符串,尤其是因为这最终将成为通过网络服务公开的公共(public) API。
关于c# - 如何在代码中模拟类似单选按钮的功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5589354/