【问题标题】:Get *.proto files based on c# classes基于 c# 类获取 *.proto 文件
【发布时间】:2012-07-03 11:06:44
【问题描述】:

我有以下用例:有几个用 ProtoContract 类装饰的程序集,我想基于程序集生成 proto 文件。那么问题来了怎么做呢?

我的第一个意图是使用 Serailizer.GetProto,但它是通用方法,对我不起作用,因为我只知道运行时的类类型。

还有为什么在 r480 中 GetProto 没有被执行?

我也知道 VS08/10,但它似乎对我的场景没有帮助。

提前致谢。

【问题讨论】:

  • 对于信息,我刚刚在 v2 中推送了一个新的提交。实验性的,需要更多的测试 - 但它确实某些东西

标签: protobuf-net


【解决方案1】:

您可以使用Serializer.GetProto 方法进行一点反思:

var method = typeof(Serializer).GetMethod("GetProto").MakeGenericMethod(type);
Func<string> getProto = Delegate.CreateDelegate(typeof(Func<string>), method);
var proto = getProto();

【讨论】:

  • 太好了,谢谢...这都是我对反射能力的了解不足。同样 Func 不是 Action.
  • 小注;您无需为此创建委托;你可以使用string proto = (stirng) blah .MakeGenericMethod(type).Invoke(null,null);
  • @MarcGravell 好点。我通常根据类型缓存此类函数(因为将使用的类型子集通常是有限的)并且调用委托的性能更高(多次调用时)。结果,它已成为我编写此类代码的事实上的方式。另外,我认为Delegate.CreateDelegate 方法不太为人所知,所以我想给他们一点播出时间......
  • @rich.okelly 因为输出不会改变,所以按类型缓存字符串会更有效
  • @MarcGravell 在这种情况下是的,我指的是一般情况。
【解决方案2】:

还有为什么在 r480 中 GetProto 没有被执行?

因为我的时间有限,而且请求很多。最近有很多人问我GetProto,所以我在我的名单上把它往上推。我必须优先考虑功能方面的好处,努力反对可能的使用。 GetProto 不是序列化的“核心”,而是我想继续支持的东西。只是需要努力。这个功能的使用让我觉得延迟 v2 代码库是不合理的。

好消息是 v2 的核心是非泛型的,保留旧的泛型 API 纯粹是为了兼容。所以当我重新实现它时,它完全可以在没有泛型的情况下使用。


更新:已在 r545 中对此进行了实验性剪辑。它通过了 v1 测试,但是:关于此功能的 v1 测试并不多!所以:我很快就会为此添加更多测试。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-20
    • 2021-12-30
    • 1970-01-01
    相关资源
    最近更新 更多