我现在有:
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; }
答案 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本身。