如何从 C# 中的泛型参数获取静态属性?

问题描述 投票:0回答:1

我的目标是拥有一个代表许多 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。

c# generics
1个回答
0
投票

您可以使用静态接口方法来做到这一点:

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
}
© www.soinside.com 2019 - 2024. All rights reserved.