2009-06-01 59 views
5

如何让我的CookieData在下面的代码中是泛型的?我在ICookieService2的声明中遇到编译时错误。在接口中使用泛型

public struct CookieData<T> 
{ 
    T Value { get; set; } 
    DateTime Expires { get; set; } 
} 

public interface ICookieService2: IDictionary<string, CookieData<T>> 
{ 
    // ... 
} 

我的错误是:

类型或命名空间名称 'T' 找不到(是否缺少using指令或程序集引用?)

我想要ICookieService2将通用数据插入到其中。谢谢!

编辑这难道不会锁定我成为一个T为建设任何ICookieService2

编辑2我所试图做的是以下几点:

CookieData<int> intCookie = { Value = 27, Expires = DateTime.Now }; 
CookieData<string> stringCookie = { Value = "Bob", Expires = DateTime.Now }; 

CookieService2 cs = new CookieService2(); 
cs.Add(intCookie); 
cs.Add(stringCookie); 

回答

7

看起来你有3个选择这里

让ICookieService2通用

public interface ICookieService2<T> : IDictionary<string, CookieData<T> { 
... 
} 

创建一个非泛型基地用于CookieData并在界面中使用

public interface ICookieData {} 
public class CookieData<T>: ICookieData{} 
public interface ICookieService2 : IDictionary<string, ICookieData> {} 

选择一个具体的实施

public interface ICookieService : IDictionary<string, CookieData<int>> {} 
4

您必须ICookieService2通用以及:

public interface ICookieService2<T>: IDictionary<string, CookieData<T>> 
{ 
    // ... 
} 
2

OK,这里有你想要的东西:

public interface ICookieDataBase 
{ 
    DateTime Expires { get; set; } 
} 

public struct CookieData<T> : ICookieDataBase 
{ 
    public T Value { get; set; } 
    public DateTime Expires { get; set; } 
} 

public class ICookieService : IDictionary<string, ICookieDataBase> 
{ 
    // ... 
} 

public void DoWork() 
{ 
    var intCookie = 
     new CookieData<int> { Value = 27, Expires = DateTime.Now }; 

    var stringCookie = 
     new CookieData<string> { Value = "Bob", Expires = DateTime.Now }; 

    ICookieService cs = GetICookieService(); 
    cs.Add(intCookie); 
    cs.Add(stringCookie); 
} 
0

不确定C#,但Java的方式也是声明哟ur ICookieService2拥有<T>参数,或者指定<T>作为CookieData中的具体内容。

+0

好的,从上面看到的答案这是正确的:) – Jorn 2009-06-01 23:09:21

1

我想你想要的是:

public interface ICookieService2<T>: IDictionary<string, CookieData<T>> 
{ 
    // ... 
} 

目前ICookieService2是不是通用的,所以没有定义吨。

这允许你创建的类实现ICookieService2<string>ICookieService2<int>

编辑: 响应最新的要求,我认为这真的取决于它正是你需要的。但是,像这样的东西可能适合你。

public interface ICookieData 
{ 
    object Value {get;} // if you need to be able to set from CookieService, life gets harder, but still doable. 
    DateTime Expires {get;} 
} 

public struct CookieDate<T> : ICookieData 
{ 
    T Value {get;set;} 
    DateTime Expires {get;set;} 

    object ICookieData.Value 
    { 
     get 
     { 
      return Value; 
     } 
    } 
} 

然后CookieService可以或有一个列表,你将能够同时添加CookieData和CookieData。如果你需要从CookieService写入(设置),它稍微复杂一点,可能更好的是不使用泛型。但是,如果你只需要能够检索CookieData,那么这可能适用于你。

1

你需要一个非通用接口做到这一点:

public interface ICookieData 
{ 
    // you need this to get the value without knowing it's type 
    object UntypedValue { get; } 
    // whatever you need additionally ... 
    Type DataType { get; } 

    DateTime Expires { get; set; } 
} 

public struct CookieData<T> : ICookieData 
{ 
    // ICookieData implementation 
    public object UntypedValue { get { return Value; } } 
    public Type DataType { get { return typeof(T); } } 
    public DateTime Expires { get; set; } 

    // generic implementation 
    T Value { get; set; } 
} 

public interface ICookieService2: IDictionary<string, ICookieData> 
{ 
    // ... 
} 

CookieData<int> intCookie = { Value = 27, Expires = DateTime.Now }; 
CookieData<string> stringCookie = { Value = "Bob", Expires = DateTime.Now }; 

CookieService2 cs = new CookieService2(); 
cs.Add(intCookie); 
cs.Add(stringCookie); 
0

如果我理解你的问题正确,您是想治疗泛型类型就像他们是相同的,但在目前的.NET实现你不能做到这一点。

CookieData <串>不能作为CookieData <INT>传递他们实际上是不同的类型,泛型类型是不相关的,不能投或通过像他们一样。将ICookieService2创建为开放式泛型(意思是ICookieService2 <T>)并不能解决问题,因为那样您将针对每种不同的类型使用不同的ICookieService2类型,并且所有这些类型都将位于不同的字典中。

您可以创建一个ICookieData界面和CookieData <牛逼>实现,并使用ICookieData存储在字典中的项目(如斯特凡已经暗示)。

你可以在C#4.0中做什么(有一些限制)。有一篇关于它的文章here直到那时,你必须将它作为它们通用的非泛型类型传递,比如接口,或者只是将value参数作为字典上的对象,因为你将不得不大小写无论如何,如果你使用基元作为类型参数,它就可以使用它。

0

你可以尝试

public struct CookieData<T> 
    where T : Object 
{ 
    T Value { get; set; } 
    DateTime Expires { get; set; } 
} 

这样T的实例将被迫有对象的基本类型。 (几乎在C#中的一切(例如int == System.Integer等)。