对不同类型 Func 的引用
我有一个单例,可以注册一个函数来解析每种类型的 id 值:
public void RegisterType<T>(Func<T, uint> func)
例如:
RegisterType<Post>(p => p.PostId );
RegisterType<Comment>(p => p.CommentId );
然后我想解析一个对象的 id,如下所示:
GetObjectId(myPost);
GetObjectId 定义在哪里
public uint GetObjectId(object obj)
问题是,我如何存储引用每个函数最近调用它。 问题是每个 func 都有不同的 T 类型,我不能做这样的事情:
private Dictionary<Type, Func<object, uint>> _typeMap;
如何解决它?表达树?
问候 埃泽奎尔
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
您不需要表达式树按照您建议的方式执行此操作,只需在注册函数时嵌套该函数即可。
You don't need Expression Trees to do it the way you are suggesting, just need to nest the function when registering it.
您有两个选择:
将
GetObjectId
更改为采用T
的通用函数。然后,您可以 将
Func
存储在泛型中静态类,并通过编写FuncStorage.Value(obj)
来调用它们。使用表达式树创建调用Func
的Func
(使用强制转换)并将它们放入您的Dictionary>
中。编辑:你不需要表达式树来做到这一点;您可以使用普通的 lambda 表达式来转换为
T
。我正在考虑相反的情况(从非泛型委托生成泛型委托),这确实需要表达式树。You have two options:
Change
GetObjectId
to a generic function that takes aT
.You can then store the
Func<T, uint>
s in a generic static class and call them by writingFuncStorage<T>.Value(obj)
.Use expression trees toCreateFunc<object, uint>
s that calls theFunc<T, uint>
(using a cast) and put those in yourDictionary<Type, Func<object, uint>>
.EDIT: You don't need expression trees to do that; you can use a normal lambda expression which casts to
T
. I was thinking of the reverse case (generating a generic delegate from a non-generic one), which does require expression trees.我不知道你为什么这么说。这有效:
用法:
I'm not sure why you say this. This works:
Usage:
@SLacks,根据你的建议,我改变了我的方法:
谢谢!
@SLacks, following your advise i have changed my approach to:
thanks!
我无法将
GetObjectId
更改为GetObjectId
因为我不知道运行时的类型。所以,我将字典定义更改为:
然后通过反射调用它:
非常感谢大家
I cant change
GetObjectId
toGetObjectId<T>
because i don´t known the type on runtime.So, i have changed the dictionary definition to:
and then invoke it via Reflection:
Thank you all so much