0

我需要一点帮助,我正在使用一个类,并希望根据类型 int、string 和 datetime 的选择来设置属性这是我编写的代码,但由于我的构造函数会在公共字符串 paramValue 和公共 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;
    }
}
4

2 回答 2

1

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

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

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

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

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

这样,您可以控制可以创建哪些类型。

于 2013-07-24T17:11:32.873 回答
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

现在,getonstring paramValue在功能上等同于这种情况。您试图让编译器根据返回值决定调用哪个 paramValue。

于 2013-07-24T17:23:43.673 回答