Tom*_*der 5 .net c# generics compiler-errors
我正在尝试创建一个泛型类:
public class ClassName<T>
{
public T AccessEntity(string id)
{
return (from e in ServiceContext.CreateQuery<T>(TableName)
where e.RowKey == id // error here!
select e).FirstOrDefault();
}
}
Run Code Online (Sandbox Code Playgroud)
在这段代码中,我收到的错误是:
T不包含RowKey的定义
但是在运行时替换T的参数具有RowKey的定义.也许是因为编译器在编译时没有在T中获得RowKey的定义,这就是我收到此错误的原因.谁能告诉我如何解决这个问题?
Mar*_*ell 11
要做到这一点,你需要一个接口约束:
interface IHazRowKey {
string RowKey { get; }
}
Run Code Online (Sandbox Code Playgroud)
并指定此限制:
public class classname<T> where T : IHazRowKey {...}
Run Code Online (Sandbox Code Playgroud)
并指定: IHazRowKey每个实现:
public class Foo : IHazRowKey {....}
Run Code Online (Sandbox Code Playgroud)
现有RowKey成员应该匹配它(假设它是属性,而不是字段),因此您不需要添加任何其他额外代码.如果它实际上是一个字段(它不应该是,IMO)那么:
public class Foo : IHazRowKey {
string HazRowKey.RowKey { get { return this.RowKey; } }
...
}
Run Code Online (Sandbox Code Playgroud)
C++模板和C#泛型之间存在一个主要区别:如果编译器T在编译泛型类或方法时不知道某个方法,那么传递给实例化泛型的类并不重要,它会给你一个错误.这是因为C#需要能够从实例化的位置单独编译通用代码(请记住,C#中没有头文件).
您可以定义一个接口,并限制T它以便在泛型中使用属性和方法.添加RowKey到您的界面,并添加where T : myinterface到您的通用声明.