如何在代码中模拟类似单选按钮的功能

时间:2011-04-08 01:06:37

标签: c#

我遇到了一个有趣的问题,到目前为止,我还没有找到一个令人信服的答案。

想象一下,我在表单上有一个单选按钮,三个选项是:

  • 出生日期
  • 兄弟姐妹数
  • 名称

当您将这些实现为单选按钮时,您只能指定其中一个。

现在想象一下,我实际上也想要指定值。所以我的表格看起来像这样:

  • 出生日期:yyyy / mm / dd
  • 兄弟姐妹的数量:nn
  • 姓名:xyz

所以,如果我选择单选按钮'出生日期',那么我就可以输入Datetime作为值,但是如果我要选择Name,那么我想要一个字符串,并且唉,如果我想选择兄弟姐妹数,那么我想要一个整数作为值。

我不认为这在形式设计方面特别突破。

有趣的问题是,我如何使用C#代码执行此操作。让我解释一下。

我有一个方法,它接受一个“PersonalityTrait”类型的对象。但是,此PersonalityTrait对象只能设置三个属性中的一个,要么具有出生日期,要么具有多个兄弟,或者具有名称。它不能包含2个或更多属性。我该如何确保它只包含三个属性中的一个?

我考虑将此任务留给任何使用此对象检查它是否具有多个属性集的代码,但我不确定该任务是否应留给调用代码。它只是违背DRY(不要重复自己)的原则。另外,我不相信调用代码要保持警惕。

我考虑在PersonalityTrait对象上创建一个方法来验证它(通过检查只设置了一个属性),但同样,我不确定调用代码是否会调用它。

我考虑过更改SET属性方法代码以实际检查其他属性,如果已经设置了其他属性则抛出异常,但这感觉就像在表单上提供清单而不是单选按钮并抛出异常用户选择了多个选项(这对用户来说只是不直观!!)。

如果这只是一个字段,我会创建一个Enum并使其成为三个选项之一(生日,兄弟姐妹或姓名),但问题是,我也想接受一个值,我想要该值是强类型的。

这似乎是一个Jon-Skeet类型的问题,LOL,我可能不得不回顾一下'C#in Depth'来解决这个问题。但我想我现在就把它贴在StackOverFlow上!!

4 个答案:

答案 0 :(得分:1)

这个问题缺少的是需要将容器作为参数传递给方法(我知道海报并与他讨论过这个问题)。

我喜欢泛型的想法。我在想这样的事情:

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; }
}

我不喜欢神奇的字符串,特别是因为这最终会成为通过网络服务公开的公共API。

答案 1 :(得分:0)

有点在这里大声思考,所以它可能没什么意义。

我会enum名为PersonalityTrait

enum PersonalityTrait
{
    DateOfBirth,
    NumberOfSiblings,
    Name
}

您可以拥有通用PersonalityTraitValue<T>

public class PersonalityTraitValue<T>
{
    public T Value { get; set; }
    public PersonalityTrait Trait { get; set; }
}

您可以拥有PersonalityTraitManagerPersonalityTraitFactory类,接受enum并返回/设置PersonalityTraitValue<T>个实例。

正如我所说,这可能不是最好的主意,但这是第一个浮现在脑海中的想法。

答案 2 :(得分:0)

可能是这样的:

class DataHolder<T>
{
    private T datacontainer;

    public DataHolder(T input)
    {
        datacontainer = input;
    }
    public DataHolder() {}

    public T Data
    {
        get { return datacontainer; }
        set { datacontainer = value; }
    }
}

答案 3 :(得分:0)

也许:

class MyDataHolder {
    int numberOfSiblings = -1;
    public property int NumberOfSiblings {
        get {
            ClearData();
            numberOfSiblings = value;
        }
    }

    DateTime dateOfBirth = null;
    public property DateTime DateOfBirth {
        get {
            ClearData();
            dateOfBirth = value;
        }
    }

    String name = null;
    public property String Name {
        get {
            ClearData();
            name = value;
        }
    }


    private void ClearData() {
        numberOfSiblings = -1;
        dateOfBirth = null;
        name = null;
    }


    public object GetData() {
        if (numberOfSiblings != -1) {
            return numberOfSiblings;
        }
        else if (dateOfBirth != null) {
            return dateOfBirth;
        }
        else if (name != null) {
            return name;
        }

        return null;
    }
}