我需要“打开类型”:给定一个 type 的参数T
,找到并执行一个 form 的方法void Method (T param)
。
这可以通过 switch 语句或 a 来解决Dictionary<Type, Action>
,但是我想避免在这种情况下进行必要的强制转换。
我找不到上述(或类似)问题中提到的以下方法:
创建一个充当集合的静态泛型类型:
public static class Commands<T> { public static Action<T> Handler; }
创建一个使用该类型的存储库,如类型安全字典:
public class CommandRepository { public void Register<T>(Action<T> handler) { Commands<T>.Handler = handler; } public void Run<T>(T parameter) { // null checks etc. Commands<T>.Handler(parameter); } }
示例用法:
public void CreateUser(CreateUserParams p) { Console.WriteLine("Creating " + p.Name); } // ... var repo = new CommandRepository(); repo.Register<CreateUserParams>(CreateUser); repo.Register<DeleteUserParams>(DeleteUser); repo.Run(new CreateUserParams { Name = "test" }); repo.Run(new DeleteUserParams { Name = "test" });
如前所述,使用Dictionary<Type, Action>
中的a 可以实现相同的行为ComandRepository
,但是我必须转换方法参数,或者,如果我使用接口而不是Action
,则IFoo<T>
在获取字典项后转换为 a 。
我的问题是:可以(ab-)使用这样的泛型类型(给定大量可能的值T
)吗?
(奖励问题)如果不行,为什么不呢?这会导致什么成本/负面影响?
最后一点:我意识到这不适用于类型层次结构或接口。类型T
必须完全匹配,这在我的场景中很好。
编辑:我发现Jil,一个 JSON 序列化器,也依赖于这种模式。查看TypeCache
类型,它存储了一个委托来序列化一个类型的对象T
(据我通过浏览代码了解到的)。由于这TypeCache
将存储大量类型,我认为该模式通常没有问题。
了解类型或其静态成员是否需要进行垃圾收集,或者是否需要考虑其他性能影响仍然很有趣。