C# 仅在接口属性上添加泛型,而不在接口上添加泛型
我创建了一个接口,它将作为某些对象集的数据类型,当定义这些对象时,它们的一个属性的数据类型是未知的,因此我需要一个接口。但是.net不让我这么做C# 仅在接口属性上添加泛型,而不在接口上添加泛型,c#,generics,C#,Generics,我创建了一个接口,它将作为某些对象集的数据类型,当定义这些对象时,它们的一个属性的数据类型是未知的,因此我需要一个接口。但是.net不让我这么做 public interface IClipbaseData { T ClipObjectData<T> { get; set;} } class ClipTextData : IClipbaseData { string _clipContent; public string ClipObjectDa
public interface IClipbaseData
{
T ClipObjectData<T> { get; set;}
}
class ClipTextData : IClipbaseData
{
string _clipContent;
public string ClipObjectData
{
get
{
return _clipContent;
}
set
{
// validate the input
if (string.IsNullOrEmpty(value))
{
throw new ArgumentNullException("Error");
}
_clipContent = value;
}
}
}
公共接口IClipbaseData
{
T ClipObjectData{get;set;}
}
类ClipTextData:IClipbaseData
{
字符串_clipContent;
公共字符串ClipObjectData
{
得到
{
返回clipContent;
}
设置
{
//验证输入
if(string.IsNullOrEmpty(value))
{
抛出新的ArgumentNullException(“错误”);
}
_clipContent=值;
}
}
}
我在接口上遇到错误,意外使用了泛型名称。我知道我可以在接口上声明泛型,但我不想这样做,因为在将接口用作对象类型时,我不知道泛型数据类型
但在创建类来实现此接口时,我知道属性数据类型
我也可以在接口中将属性声明为对象,并且不使用泛型,但是为什么我不能使用泛型呢
- 我不想在接口上添加泛型的一个典型场景:
对象是由IClipbaseData定义的,该对象可以是实现IClipbaseData的任何具体类。它所属的具体类只能在运行时确定,因此我们不知道属性ClipObjectData在运行前的数据类型。属性不能接受这样的类型参数,您可以在接口本身上定义类型参数,这将使您的类型工作。在这种情况下,如果要对属性使用泛型类型参数,必须在接口本身上定义它
public interface IClipbaseData<T>
{
T ClipObjectData { get; set; }
}
class ClipTextData : IClipbaseData<string>
{
string _clipContent;
public string ClipObjectData
{
get
{
return _clipContent;
}
set
{
// validate the input
if (string.IsNullOrEmpty(value))
{
throw new ArgumentNullException("Error");
}
_clipContent = value;
}
}
}
公共接口IClipbaseData
{
T ClipObjectData{get;set;}
}
类ClipTextData:IClipbaseData
{
字符串_clipContent;
公共字符串ClipObjectData
{
得到
{
返回clipContent;
}
设置
{
//验证输入
if(string.IsNullOrEmpty(value))
{
抛出新的ArgumentNullException(“错误”);
}
_clipContent=值;
}
}
}
否则,您必须调用属性,如var someValue=clipTextDataObj.ClipObjectData代码>,这样做没有多大意义,因为具体类型已经定义了它返回的内容
如果不想在接口上定义它,则必须创建单独的getter/setter方法:
public interface IClipbaseData
{
T GetClipObjectData<T>();
void SetClipObjectData<T>(T value);
}
公共接口IClipbaseData
{
T GetClipObjectData();
void SetClipObject数据(T值);
}
但这需要您以一种通用的方式实现它:
class ClipTextData : IClipbaseData
{
public T GetClipObjectData<T>()
{
throw new NotImplementedException();
}
public void SetClipObjectData<T>(T value)
{
throw new NotImplementedException();
}
}
class-ClipTextData:IClipbaseData
{
public T GetClipObjectData()
{
抛出新的NotImplementedException();
}
公共无效SetClipObject数据(T值)
{
抛出新的NotImplementedException();
}
}
但您可以在这里添加另一个抽象:
class StringClipTextData : ClipTextData
{
public string ClipObjectData
{
get { return base.GetClipObjectData<string>(); }
set { base.SetClipObjectData(value); }
}
}
类StringClipTextData:ClipTextData
{
公共字符串ClipObjectData
{
获取{return base.GetClipObjectData();}
set{base.SetClipObjectData(值);}
}
}
必须将其设置为接口本身的类型参数。将其设置为方法而不是属性。泛型属性要求在实例化时知道该类型。如果直到运行时才知道该类型,如何将其传递给string.IsNullOrEmpty
?您将返回类型指定为string,因此您知道要使用的数据类型非常旧的post,但它可能仍然相关:OP已经知道这一点。他们不知道实例化时的类型。@maccettura是的,但不可能用这种方式定义属性,我澄清了如何使用单独的方法来定义属性。为了完整起见,您是否只需要一个私有对象数据
然后GetClipObjectData
将以T的形式返回数据
和SetClipObjectData
将执行data=value代码>?@RufusL你是要我添加代码吗?我把它留白了,因为它与问题的实质无关,但我可以把它加进去。不,我只是在大声思考如何实施它。:)