1

我目前有:

public HashSet<int> UniqueData { get; private set; }

如果设置了另一个属性,我想创建它

public HashSet<string> UniqueData { get; private set; }

所以在构造函数中它变成

if (MyProperty)
  UniqueData = new HashSet<string>();
else
  UniqueData = new HashSet<int>();

有没有办法将属性声明为:

  public HashSet<T> UniqueData { get; private set; }
4

5 回答 5

3

您不能声明两个仅类型不同的属性。如果您HashSet<T>使整个类在T.

class Example<T> {
    public HashSet<T> Unique {get;set;}
    public Example(HashSet<T> hs) {
        Unique = hs;
    }
}
public static void Main() {
    Example<int> a = new Example<int>(new HashSet<int>());
    Example<string> b = new Example<string>(new HashSet<string>());
}
于 2012-05-28T11:48:55.450 回答
1

不幸的是,不,您无法做到这一点。必须在编译时声明属性数据类型。

创建一个类型为的类T并将其分配T给属性T

public class TClass<T>
{
    public HashSet<T> UniqueData { get; set; } 
}

并称它为

public static void Main() 
{
    TClass<int> a = new TClass<int>(){ UniqueData = new HashSet<int>()};
    TClass<string> b = new TClass<string>(){ UniqueData = new HashSet<string>()};
}

此外,如果它private set你只能从类内部设置它的值。

于 2012-05-28T11:52:31.877 回答
1

您可能必须在类级别执行此操作才能获得返回类型HashSet<T>

public class MyClass<T>
{

  #region ctors
  public MyClass()
  {
    this.UniqueData = new HashSet<T>();
  }
  #endregion

  public HashSet<T> UniqueData { get; private set; } 
}

用法:

MyClass cint = new MyClass<int>();
cint.UniqueData.Add(1);

MyClass cstr = new MyClass<string>();
cstr.UniqueData.Add("something unique");
于 2012-05-28T11:52:53.377 回答
0

public HashSet<object> UniqueData { get; private set; }. 类型必须在编译时指定,所以不,在这种情况下强类型系统不是你的朋友。

于 2012-05-28T11:52:09.443 回答
0

我想你的设计有错误。您希望在程序的其余部分中使用 HashSet 的哪些与存储在 Hash 集中的数据类型无关的功能?

然后公开 HashSet 的那些特性(例如通过适配器类或一组属性),而不是 HashSet 本身。

于 2012-05-28T11:55:28.053 回答