我正在尝试实现一个 C# 静态抽象接口。我已阅读文档和博客,但我看不出我做错了什么。
public interface IModel
{
abstract static PropertyInfo KeyProperty { get; }
abstract static string TableName { get; }
}
public abstract record Model<TKey>: IModel
{
public static PropertyInfo KeyProperty { get; }
public static string TableName { get; }
...
}
public Repository<TModel, TKey> where TModel : Model<TKey>
{
public void SomeMethod()
{
// This throws a compiler error: "CS0704 Cannot do non-virtual member lookup in 'TModel' because it is a type parameter"
var col = TModel.KeyProperty.Name;
}
}
由于某种原因,编译器无法确定 TModel 实现了 IModel,即使它继承自实现了 IModel 的类。幸运的是,解决方案很简单。而不是这个:
public Repository<TModel, TKey> where TModel : Model<TKey>
这样做:
public Repository<TModel, TKey> where TModel : Model<TKey>, IModel