gpt4 book ai didi

protocol-buffers - 使用ProtoContract属性在所有类型上自动执行GetProto的方法

转载 作者:行者123 更新时间:2023-12-02 04:01:40 29 4
gpt4 key购买 nike

我想使用反射来查看.dll中的所有类型,并为具有ProtoContract属性的任何文件生成.proto文件。我将使用.proto文件生成C++类,以便我的C#代码可以与某些C++互操作。这段代码将通过.dll查找具有ProtoContract属性的类型,但是我不知道如何将类型动态传递给GetProto()。

//get assemblies in directory.
string file = @"C:\bungie\networking\shared\online\output\bin\Test\Xetrov\Xetrov.Core\Xetrov.Core.dll";
var assembly = Assembly.LoadFile(file);
foreach (var type in assembly.GetTypes())
{
if (!type.IsClass || type.IsNotPublic)
{
continue;
}
//Get all the attribute for the type
object[] attributes = type.GetCustomAttributes(true);
//Look for the ProtoContract attribute
if(attributes.Where(att => att is ProtoBuf.ProtoContractAttribute).Any())
{
// We have a type that protobuf can use, generate the .proto file
// How to tell it what type T is?? can't use variable type
string protoDefinition = ProtoBuf.Serializer.GetProto<T>();
}
}

有什么想法我可以做到这一点吗?还是为所有类型生成.proto文件的更好方法?

谢谢!!

最佳答案

首先,请注意,GetProto尚未在v2中重新实现,但是将在某个时候出现。因此,我假设我们正在谈论v1。因此,我怀疑MakeGenericMethod是您最好的选择:

// outside loop
var method = typeof(ProtoBuf.Serializer).GetMethod("GetProto");
...
// inside loop
var proto = untyped.MakeGenericMethod(type).Invoke(null, null);

当我在v2中重新实现此功能时,它也可以在非通用API上使用(v2以非通用为核心)。

关于protocol-buffers - 使用ProtoContract属性在所有类型上自动执行GetProto的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10251082/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com