在属性中指定T.

时间:2012-05-28 11:47:05

标签: c# .net generics

我现在有:

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

5 个答案:

答案 0 :(得分: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>());
}

答案 1 :(得分: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只能从类内部设置其值。

答案 2 :(得分: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");

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

然后公开HashSet的那些功能(例如,通过Adapter类或一组属性),而不是HashSet本身。