C# 从不存在的类型创建对象。了解变更类型/激活器

C# 从不存在的类型创建对象。了解变更类型/激活器,c#,reflection,C#,Reflection,是否可以将对象及其类型参数传递给不具有该类型的应用程序并创建其实例 比如说 Application A 有类型Foo 我们实例化它并将值作为对象和类型发送给应用程序B Application B 未引用类型Foo 那么,是否可以说System.Convert.ChangeType(object,Type),并能够转换对象或CreateInstance以生成该类型的新实例 如果这让人困惑,那么让我们假设一下,我不确定ChangeType是否使用类型信息来转换类型,或者简而言之,它是否执行DLL

是否可以将对象及其类型参数传递给不具有该类型的应用程序并创建其实例

比如说

Application A
类型Foo

我们实例化它并将值作为
对象
类型
发送给应用程序B

Application B
未引用类型
Foo

那么,是否可以说
System.Convert.ChangeType(object,Type)
,并能够转换对象或CreateInstance以生成该类型的新实例


如果这让人困惑,那么让我们假设一下,我不确定ChangeType是否使用类型信息来转换类型,或者简而言之,它是否执行DLL查找。

.NET使用.DLL中的类型元数据来处理类型,包括对象创建。因此,不,.NET无法创建没有此元数据的实例

此外,您不能在应用程序之间发送任何复杂数据。您只能将数据序列化为二进制/XML/JSON/something-other格式,然后对其进行反序列化

.NET应用程序可以序列化和反序列化标准.NET类型,例如整数、浮点、字符串、日期和时间、时间跨度、IP地址、异常等

如果您想支持自己的类型,应该在应用程序之间共享它。首先,您可以在源代码中实现它,并将您的项目插入这两种解决方案。第二,你可以共享DLL。至少您可以将程序集打包到NuGet数据包,并将此数据包安装到这两个解决方案中


当然,您应该使您的类型可序列化。

不,它不是,除非两个应用程序都引用了共享接口。否则,我认为最多可以尝试使用反射获取属性。另一个问题可能会出现,如果不能直接引用类型,您将如何编写ChangeType?这具有X-Y问题的所有特征。你到底想做什么?一个应用程序如何将对象“发送”给另一个应用程序?另一个应用程序将如何处理它?您如何在应用程序之间进行“传递”?您使用的是命名管道还是其他形式的IPC?@spender我有一个共享API,我想知道是否可以在API上强制转换匿名对象,或者是否只能在具有引用的其他客户端上进行转换。请注意,我计划在被引用的客户端上执行此操作,但是我不知道是否可以在API上执行此操作,因此了解这些内容很好。谢谢,因此,传递带有类类型信息的类型变量将不起作用,因为本地应用程序中缺少类型信息。事实上,您不能在应用程序之间传递类型变量。实际上,您可以传递完整的类型名称,如
Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider、Microsoft.CodeDom.Providers.DotNetCompilerPlatform、Version=1.0.4.0、Culture=neutral、PublicKeyToken=31bf3856ad364e35
。如您所见,此名称包括程序集的名称,即包含类型的DLL的名称。