C# 在属性中指定T

C# 在属性中指定T,c#,.net,generics,C#,.net,Generics,我现在有: public HashSet<int> UniqueData { get; private set; } public HashSet UniqueData{get;private set;} 如果设置了另一个属性,则我希望设置它 public HashSet<string> UniqueData { get; private set; } public HashSet UniqueData{get;private set;} 所以在构造函数中,它变成

我现在有:

public HashSet<int> UniqueData { get; private set; }
public HashSet UniqueData{get;private set;}
如果设置了另一个属性,则我希望设置它

public HashSet<string> UniqueData { get; private set; }
public HashSet UniqueData{get;private set;}
所以在构造函数中,它变成

if (MyProperty)
  UniqueData = new HashSet<string>();
else
  UniqueData = new HashSet<int>();
if(MyProperty)
UniqueData=newhashset();
其他的
UniqueData=newhashset();
是否有办法将财产声明为:

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

您不能声明两个仅在类型上不同的属性。如果在
T
上将整个类设置为泛型,则可以使用
HashSet
语法

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>());
}
类示例{
公共哈希集唯一{get;set;}
公共示例(HashSet-hs){
唯一=hs;
}
}
公共静态void Main(){
示例a=新示例(新HashSet());
示例b=新示例(新HashSet());
}

您不能声明两个仅在类型上不同的属性。如果在
T
上将整个类设置为泛型,则可以使用
HashSet
语法

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>());
}
类示例{
公共哈希集唯一{get;set;}
公共示例(HashSet-hs){
唯一=hs;
}
}
公共静态void Main(){
示例a=新示例(新HashSet());
示例b=新示例(新HashSet());
}

公共HashSet UniqueData{get;private set;}
。必须在编译时指定类型,因此,不,在这种情况下,强类型系统不是您的朋友。

public HashSet UniqueData{get;private set;}
。类型必须在编译时指定,因此,在这种情况下,强类型系统不是您的朋友。

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

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

public class TClass<T>
{
    public HashSet<T> UniqueData { get; set; } 
}
公共类TClass
{
公共HashSet 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>()};
}
publicstaticvoidmain()
{
TClass a=new TClass(){UniqueData=new HashSet()};
TClass b=new TClass(){UniqueData=new HashSet()};
}

此外,如果它的
私有集
只能从类内部设置它的值。

不幸的是,没有办法。属性数据类型必须在编译时声明

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

public class TClass<T>
{
    public HashSet<T> UniqueData { get; set; } 
}
公共类TClass
{
公共HashSet 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>()};
}
publicstaticvoidmain()
{
TClass a=new TClass(){UniqueData=new HashSet()};
TClass b=new TClass(){UniqueData=new HashSet()};
}

此外,如果其
私有集
只能从类内部设置其值。

您可能必须在类级别执行此操作才能获得
哈希集的返回类型

公共类MyClass
{
#区域系数
公共MyClass()
{
this.UniqueData=new HashSet();
}
#端区
公共HashSet UniqueData{get;private set;}
}
用法:

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

MyClass cstr = new MyClass<string>();
cstr.UniqueData.Add("something unique");
MyClass cint=newmyclass();
cint.UniqueData.Add(1);
MyClass cstr=新的MyClass();
cstr.UniqueData.Add(“独一无二的东西”);

您可能必须在类级别执行此操作,才能获得
哈希集的返回类型

公共类MyClass
{
#区域系数
公共MyClass()
{
this.UniqueData=new HashSet();
}
#端区
公共HashSet UniqueData{get;private set;}
}
用法:

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

MyClass cstr = new MyClass<string>();
cstr.UniqueData.Add("something unique");
MyClass cint=newmyclass();
cint.UniqueData.Add(1);
MyClass cstr=新的MyClass();
cstr.UniqueData.Add(“独一无二的东西”);

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


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

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


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

然后,您可以通过将类设置为泛型,并从非泛型基类派生出不依赖于哈希集类型的内容来解决问题。我只在两个位置使用它,一个用于添加,另一个用于从中读取最后一个值。我可能会做的是使它成为泛型,然后在它接受最后一项时测试该类型,因为在这一点上它执行lastvalue减去999,显然不能对字符串执行。你的方法可能有点过于复杂,那么你可以通过使你的类成为泛型的,并从非泛型基类派生出那些不依赖于哈希集类型的东西来解决这个问题。我只在两个地方使用它,一个用来添加它,另一个用来读取它的最后一个值。我可能会做的是使它成为泛型,然后在它接受最后一项时测试该类型,因为在这一点上它执行lastvalue减去999,显然不能对字符串执行。也许你的Wayoop有点太复杂了。。。忘记了私有集的构造函数。哦。。。忘记了私有集的构造函数。