Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 仅在接口属性上添加泛型,而不在接口上添加泛型_C#_Generics - Fatal编程技术网

C# 仅在接口属性上添加泛型,而不在接口上添加泛型

C# 仅在接口属性上添加泛型,而不在接口上添加泛型,c#,generics,C#,Generics,我创建了一个接口,它将作为某些对象集的数据类型,当定义这些对象时,它们的一个属性的数据类型是未知的,因此我需要一个接口。但是.net不让我这么做 public interface IClipbaseData { T ClipObjectData<T> { get; set;} } class ClipTextData : IClipbaseData { string _clipContent; public string ClipObjectDa

我创建了一个接口,它将作为某些对象集的数据类型,当定义这些对象时,它们的一个属性的数据类型是未知的,因此我需要一个接口。但是.net不让我这么做

 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你是要我添加代码吗?我把它留白了,因为它与问题的实质无关,但我可以把它加进去。不,我只是在大声思考如何实施它。:)