T不包含RowKey的定义

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)

  • 不应该是ICanHazRowKey吗?:) (3认同)
  • @Tom没有改变任何东西; 你被允许多接口继承和单类继承, (2认同)

das*_*ght 8

C++模板和C#泛型之间存在一个主要区别:如果编译器T在编译泛型类或方法时不知道某个方法,那么传递给实例化泛型的类并不重要,它会给你一个错误.这是因为C#需要能够从实例化的位置单独编译通用代码(请记住,C#中没有头文件).

您可以定义一个接口,并限制T它以便在泛型中使用属性和方法.添加RowKey到您的界面,并添加where T : myinterface到您的通用声明.