2013-07-24 70 views
0

我需要一点帮助我正在使用一个类,并且想要根据类型int,字符串和日期时间的选择设置属性这里是我编写的代码,但由于我的构造函数会混淆public字符串paramValue和公共int? paramValue什么是设置一个基于选择属性,以便只有一个属性可以设置一个用于说明谢谢任何建议基于选择的C#属性

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

您的代码无法编译。你不能有两个同名的属性。如果可以的话,你不应该这样做。思考好名字很难,但它是一半的工作。这将防止这成为一个问题。 –

+1

您不能用两种不同的返回类型声明两次相同的属性名称。 – nicholas

+1

您对属性和参数的使用有点困惑。 – Schaliasos

回答

1

基本上最好的办法,你不能有多个性质的对象,只有对不同按类型。你有几个选择。

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

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

在你的二传手,你可以抛出一个异常,如果该值是你不喜欢的类型。你也必须upcast每次你打电话给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); 
} 

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

+0

感谢迈克让我试试你的方式。+ 1为第一个答案 – Pamma

+0

静态方法需要泛型类型参数。 – asawyer

+0

@MikeChristensen我明白你想做什么,但就目前而言,这不会被编译。 '使用泛型类型'UserQuery.PassData '需要1个类型参数' – asawyer

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 

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

+0

对于一个好的建议+1并提供给我知识。我可能需要深入阅读C#。 – Pamma

+0

@Pamma顺便说一句,如果你想表达一个可以包含字符串或int或DateTime的类型,你可能想看看这个问题的接受答案:http://stackoverflow.com/问题/ 3151702 /歧视工会在C - 锐(也看看评论,其中朱丽叶提供了一个更美丽的选择,国际海事组织) –