在类型层次结构中的所有派生类型上调用通用方法

时间:2019-08-07 01:03:39

标签: c#

假设我们具有以下类型层次结构:

public abstract class Base {}
public class A : Base {}
public class B : Base {}

我需要对Base的所有派生类型执行相同的操作。这就是我想出的

public IList<T> DoWork<T>(string entityPath) where T : Base {
    // get 'json' using 'entityPath'
    return JsonConvert.DeserializeObject<List<T>>(json);
}

现在,我的问题是要以某种方式在使用者类的for循环中对所有派生类调用DoWork()。我希望工作的是这样的:

var entities = new Dictionary<string, Type> {
    ['a', TypeOf(A)],
    ['b', TypeOf(B)]
}
foreach(var e in entitties) {
    DoWork<e.Value>(e.Key)
}

显然不起作用。

如果这种方法完全有缺陷,我很想知道替代方法。

1 个答案:

答案 0 :(得分:2)

如果您在编译时不知道泛型,则不能使用泛型,但幸运的是,JsonConvert.DeserialiseObject的重载需要一个字符串和一个Type

因此,您可以添加非常规的DoWork重载:

public object DoWork(string entityPath, Type type) {
    // get 'json' using 'entityPath'
    var listType = typeof(List<>).MakeGenericType(type);
    return JsonConvert.DeserializeObject(json, listType);
}

然后在这样的for循环中调用它:

foreach(var e in entitties) {
    DoWork(e.Key, e.Value); // why are you ignoring the return value?
}