在属性中指定 T

本文关键字:属性 | 更新日期: 2023-09-27 18:35:28

我目前有:

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

在属性中指定 T

不能声明两个仅在类型上不同的属性。如果在 T 上使整个类泛型,则可以使用 HashSet<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>());
}
不幸的是,

不,你没有办法做到这一点。属性数据类型必须在编译时声明。

创建一个类型为 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,您只能从类内部设置其值。

您可能

必须在类级别执行此操作才能获得返回类型的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");

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

我想

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

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