Protocol buffers 在具有ProtoContract属性的所有类型上自动执行GetProto的方法

Protocol buffers 在具有ProtoContract属性的所有类型上自动执行GetProto的方法,protocol-buffers,protobuf-net,Protocol Buffers,Protobuf Net,我想使用反射来查看.dll中的所有类型,并为任何具有ProtoContract属性的类型生成.proto文件。我将使用.PROTO文件来生成C++类,这样我的C代码就可以与一些C++交互。这段代码将通过.dll查找具有ProtoContract属性的类型,但我不知道如何动态地将该类型传递给GetProto() //获取目录中的程序集。 字符串文件=@“C:\bungie\networking\shared\online\output\bin\Test\Xetrov\Xetrov.Core\Xet

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

//获取目录中的程序集。
字符串文件=@“C:\bungie\networking\shared\online\output\bin\Test\Xetrov\Xetrov.Core\Xetrov.Core.dll”;
var assembly=assembly.LoadFile(文件);
foreach(assembly.GetTypes()中的变量类型)
{
如果(!type.IsClass | | type.IsNotPublic)
{
继续;
}
//获取类型的所有属性
object[]attributes=type.GetCustomAttributes(true);
//查找ProtoContract属性
if(attributes.Where(att=>att是ProtoBuf.ProtoContractAttribute).Any())
{
//我们有一个protobuf可以使用的类型,生成.proto文件
//如何判断T是什么类型?不能使用变量类型
string protoDefinition=ProtoBuf.Serializer.GetProto();
}
}
你知道我怎样才能做到这一点吗?还是为所有类型生成.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使用非通用作为核心)

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