我的目标是拥有一个代表许多 DAO 对象之一的抽象类,其中任何一个对象都可以放入由缓存键索引的内部缓存中。 实际的处理是在一个单独的处理器类中完成的,该处理器类将特定的 DAO 类作为通用参数。 我正在尝试找出如何使用通用参数来确定正确的缓存键
我正在尝试的基本上是这样的
abstract class Dao {
// some kind of static string called "CacheKeyStem". The below doesn't work because you can't have abstract static properties
abstract static string CacheKeyStem { get; }
int Id { get; set; }
string CacheKey => $"{CacheKeyStem}-{Id}";
}
PersonDao : Dao {
// override CacheKeyStem. Again, this doesn't work
public static override string CacheKeyStem => "Person";
}
CarDao : Dao {
// override CacheKeyStem. Again, this doesn't work
public static override string CacheKeyStem => "Car";
}
所以现在我们有 2 个 DAO,一个用于人,一个用于汽车。 在我的处理器课程中,我有
abstract class BaseProcessor<T> where T : Dao {
public void AddToCache(T obj){
_myCache.Add(obj.CacheKey, obj);
}
public T RetrieveFromCache(int id){
// the below obviously doesnt work either.
return _myCache.Get<T>($"{T.CacheKeyStem}-{id}");
}
}
我确信有更好的方法来完成我在这里想做的事情,但我不确定它是什么。 在 RetrieveFromCache 中,我们知道所需对象的 type,但我们没有实例。 我们知道类型扩展了
Dao
。 我需要一种方法来根据泛型参数的类型获取 CacheKeyStem。
您可以使用静态接口方法来做到这一点:
interface I {
static abstract int StaticInterfaceMethod { get; }
}
class A : I {
public static int StaticInterfaceMethod => 3;
}
class B : I {
public static int StaticInterfaceMethod => 4;
}
class Gen<T> where T : I {
public int Foo() => T.StaticInterfaceMethod;
}
void Main() {
var gena = new Gen<A>();
Console.WriteLine(gena.Foo()); // 3
var genb = new Gen<B>();
Console.WriteLine(genb.Foo()); // 4
}