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

本文关键字:单选按钮 功能 模拟类 代码 | 更新日期: 2023-09-27 17:49:31

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

假设我在表单上有一个单选按钮,三个选项是:

  • 出生日期
  • 兄弟姐妹数
  • <
  • 名称/gh>

当您将它们实现为单选按钮时,您只能指定三个中的一个。

现在假设我也想要指定值。所以我的表单看起来是这样的:

  • 出生日期:年月日
  • 兄弟姐妹数:nn
  • 名称:xyz

所以,如果我要选择'出生日期'单选按钮,那么我就可以输入Datetime作为值,但是如果我要选择Name,那么我就需要一个字符串,唉,如果我要选择Number of Siblings,那么我就需要一个整数作为值。

我不认为这在表单设计上是特别具有开创性的。

有趣的问题是,我到底如何使用c#代码做到这一点。让我解释一下。

我有一个方法,它接受一个"PersonalityTrait"类型的对象。然而,这个PersonalityTrait对象只能设置三个属性中的一个,它要么有一个出生日期,要么有许多兄弟姐妹,要么有一个名字。它不能包含2个或更多属性。我如何确保它只包含三个属性中的一个??

我想把这个任务留给任何使用这个对象来检查它是否有一个以上的属性集的代码,但我不确定这个任务应该留给调用代码。这违背了DRY(不要重复自己)原则。而且我不相信调用代码会如此警惕。

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

我想过修改SET属性方法代码,先检查其他属性,如果其他属性已经设置,就抛出异常,但这感觉就像在表单上提供一个检查表,而不是单选按钮,如果用户选择了多个选项就抛出异常(这对用户来说不太直观!!)。

如果这只是一个字段,我将创建一个Enum并使其成为三个选项之一(生日,兄弟姐妹数量或名称),但问题是,我还想接受一个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; }
}

我不喜欢神奇的字符串,特别是因为它最终将成为一个通过web服务暴露的公共API

有点想出来了,所以可能没有多大意义。

我将有一个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>实例。

正如我所说,这可能不是最好的主意,但它是我想到的第一个。

可能是这样的:

class DataHolder<T>
{
    private T datacontainer;
    public DataHolder(T input)
    {
        datacontainer = input;
    }
    public DataHolder() {}
    public T Data
    {
        get { return datacontainer; }
        set { datacontainer = value; }
    }
}

可能:

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