Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在代码中模拟单选按钮式功能_C# - Fatal编程技术网

C# 如何在代码中模拟单选按钮式功能

C# 如何在代码中模拟单选按钮式功能,c#,C#,我遇到了一个有趣的问题,到目前为止,我还没有找到一个令人信服的好答案 假设我在表单上有一个单选按钮,有三个选项: 出生日期 兄弟姐妹人数 名字 当您将它们实现为单选按钮时,您只能指定三个按钮中的一个 现在想象一下,我实际上也希望指定该值。所以我的表格是这样的: class Program { static void Main(string[] args) { var param = new Container<int>(){ Name = "Age

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

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

  • 出生日期
  • 兄弟姐妹人数
  • 名字
当您将它们实现为单选按钮时,您只能指定三个按钮中的一个

现在想象一下,我实际上也希望指定该值。所以我的表格是这样的:

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; }
}
  • 出生日期:年月日
  • 兄弟姐妹数:nn
  • 姓名:xyz
因此,如果我选择单选按钮“date of birth”,那么我可以输入Datetime作为值,但是如果我选择Name,那么我需要一个字符串,唉,如果我想要选择兄弟姐妹的数量,那么我需要一个整数作为值

我不认为这在形式设计上特别具有突破性

有趣的问题是,我该如何使用C#代码来实现这一点。让我解释一下

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

我曾考虑将此任务留给使用此对象来检查其是否有多个属性集的任何代码执行,但我不确定该任务是否应该留给调用代码执行。这完全违背了干燥(不要重复)的原则。另外,我不相信呼叫代码会如此警觉

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

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

如果这只是一个字段,我会创建一个枚举,并将其作为三个选项之一(生日、兄弟姐妹数或姓名),但问题是,我还希望接受一个值,并且希望该值是强类型的


这似乎是一个Jon Skeet类型的问题,哈哈,我可能需要复习“C#Depth”来解决这个问题。但我想我现在应该把它贴在StackOverFlow上

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

我会有一个名为
PersonalityTrait
enum

enum PersonalityTrait
{
    DateOfBirth,
    NumberOfSiblings,
    Name
}
您可以有一个泛型
PersonalityTraitValue

public class PersonalityTraitValue<T>
{
    public T Value { get; set; }
    public PersonalityTrait Trait { get; set; }
}
公共类PersonalityTraitValue
{
公共T值{get;set;}
公共PersonalityTrait Trait{get;set;}
}
您可以有一个
PersonalityTraitManager
PersonalityTraitFactory
类,该类接受
enum
并返回/设置
PersonalityTraitValue
实例

正如我所说,这可能不是最伟大的想法,但它是第一个出现在我脑海中的想法。

可能类似于:

class DataHolder<T>
{
    private T datacontainer;

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

    public T Data
    {
        get { return datacontainer; }
        set { datacontainer = value; }
    }
}
类数据持有者
{
私有T数据容器;
公共数据持有者(T输入)
{
数据容器=输入;
}
公共数据持有者(){}
公共T数据
{
获取{return datacontainer;}
设置{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;
    }
}

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

我喜欢泛型的概念。我是这样想的:

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; }
}
类程序
{
静态void Main(字符串[]参数)
{
var param=newcontainer(){Name=“Age”,Value=60};
试验(参数);
}
公共静态空隙试验(容器)
{
Write(string.Format(“{0}={1}”,container.Name,container.Value));
Console.ReadLine();
}
}
公营货柜
{
公共字符串名称{get;set;}
公共TType值{get;set;}
}

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

顺便说一句,请不要在标题中包含“C”—您已经在标记中找到了它。这听起来像是泛型的完美用法。两个已经发布的答案似乎都在正确的轨道上。拥有3个单独的属性是一种糟糕的设计,最终会导致代码过于复杂,出现错误的机会也更多。是的,需要将容器作为参数传递给方法肯定是问题的一部分。