在属性中指定 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
上使整个类泛型,则可以使用 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 本身。