C#属性基于选择

时间:2013-07-24 16:58:11

标签: c# .net

我需要一点帮助我正在使用一个类,并希望根据int,string和datetime类型的选择设置属性这里是我写的代码但是因为我的构造函数将在公共字符串paramValue和public int之间混淆? paramValue根据选择设置属性的最佳方法是什么,因此只能设置一个属性。感谢任何建议

public class PassData
{
    private string _ParamName { get; set; }
    private int? _ParamValueInt { get; set; }
    private string _ParamValueString { get; set; }
    private DateTime? _ParamValueDateTime { get; set; }


    public string paramName
    {
        get { return _ParamName; }
        set { _ParamName = value;}
    }

    public string paramValue
    {
        get { return _ParamValueString; }
        set {_ParamValueString = value; }
    }

    public int? paramValue
    {
        get { return _ParamValueInt; }
        set { _ParamValueInt = value; }
    }

    public PassData(string ParamName, int ParamValue)
    {
        paramName = ParamName;
        paramValue = ParamValue;
    }
    public PassData(string ParamName, string ParamValue)
    {
        ParamName = ParamName;
        ParamValueString = ParamValue;
    }
    public PassData(string ParamName, DateTime ParamValue)
    {
        ParamName = ParamName;
        ParamValueDateTime = ParamValue;
    }
}

2 个答案:

答案 0 :(得分:1)

基本上,您不能在仅按类型不同的对象上拥有多个属性。你有几个选择。

1)创建一个可容纳各种类型的属性:

private Object _paramValue;
public Object ParamValue
{
   get { return _paramValue; }
   set {_paramValue= value; }
}

在你的setter中,如果值是你不喜欢的类型,你可以抛出异常。每次调用getter时,你还必须 upcast 结果,这使得这个解决方案不理想。如果您想要这条路线,我建议将该属性设为接口,并为您需要的数据类型定义各种实现。

2)创建一个通用类:

public class PassData<T>
{
   private T _paramValue;
   public T paramValue
   {
      get { return _paramValue; }
      set {_paramValue= value; }
   }
}

这样做的缺点是在创建实例后无法更改类型。目前还不清楚这是否是你的要求。

我喜欢这个设计,因为它提供了使这个类的构造函数成为私有的可能性:

public class PassData<T>
{
   private PassData(T value)
   {
      this._paramValue = value;
   }
}

如果您这样做,您可以创建重载的静态方法以允许创建实例:

public static PassData<String> CreateValue(string value)
{
   return new PassData<String>(value);
}

public static PassData<Int32> CreateValue(Int32 value)
{
   return new PassData<Int32>(value);
}

这样,您就可以控制可以创建的类型。

答案 1 :(得分:1)

不是答案(从某种意义上说,它没有为你提供一种方法来做你正在尝试做的事情,正如迈克克里斯滕森的答案所涵盖的那样)。我只是想了解为什么你要做的事情不起作用。 你对它的工作期望本身并不合理,问题是c#在返回值上不是多态的。我认为其他一些语言是,C#不是。

即。在c#中,您可以这样做:

public void test(int val) {}
public void test(string val) {}
// When you call `test` with either an int or a string, 
// the compiler will know which one to call
你不能这样做:

public int test() {return 1;}
public string test() {return "1";}
// does not compile. The compiler should look at the call
// site and see what you assign the result of "test()" to
// to decide. But there are various edge cases and it was decided
// to leave this out of the language

现在,get string paramValue在功能上等同于此方案。您正试图让编译器根据返回值决定调用哪个paramValue。