C#属性基于选择

本文关键字:选择 于选择 属性 | 更新日期: 2023-09-27 18:24:50

我需要一些帮助,我正在使用一个类,并希望根据类型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;
    }
}

C#属性基于选择

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

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

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

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

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

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

不是一个答案(正如Mike Christensen的答案所涵盖的那样,它并没有为你提供一种做你想做的事情的方法)。我只是想更多地了解为什么你试图做的事情不起作用。您对它工作的期望本身并不是不合理的,问题是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

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