C# C中的类型命名空间问题#

C# C中的类型命名空间问题#,c#,.net,C#,.net,我有第三方.Net程序集,比如ThridParty.dll,它使用.Net程序集dotnetassembly.dll中的类型“dotnet-namespace.dotnet-type”。 现在,在新版本的dotnetassembly.dll中,dotnet命名空间中的“dotnet type”已被移动到新的命名空间,比如说新的dotnet命名空间。dotnet type的完全限定名称已成为new-dotnet-namespace.dotnet-type 现在我的问题是,我是否可以告诉运行时在新的

我有第三方.Net程序集,比如ThridParty.dll,它使用.Net程序集dotnetassembly.dll中的类型“dotnet-namespace.dotnet-type”。 现在,在新版本的dotnetassembly.dll中,dotnet命名空间中的“dotnet type”已被移动到新的命名空间,比如说新的dotnet命名空间。dotnet type的完全限定名称已成为new-dotnet-namespace.dotnet-type

现在我的问题是,我是否可以告诉运行时在新的名称空间(即新的dotnet名称空间)中查找类型dotnet type,而不是在旧的名称空间(即dotnet名称空间)中查找类型dotnet type

我知道,当我们想要指向新版本的程序集时,可以使用程序集重定向,但是否可以将同一程序集中的类型重定向到不同的命名空间?
我没有选择获取thridparty.dll的新版本,它使用新名称空间中的类型。

否,.Net Framework中没有任何东西可以将一种类型重定向到另一种类型

请注意,名称空间只是语法上的糖糖,可以使源代码中的名称更短,因为.Net本身名称空间只是类型名称的一部分,所以您的问题本质上是“我可以将类型指向另一个类型吗?”

解决方案:

  • 重新编译
  • 生成代理程序集
  • 重写IL以指向新类型
    • 那么:

      public Type FindType(string typeName, string assemblyName)
      {
          Assembly assembly = AppDomain.CurrentDomain.GetAssemblies().SingleOrDefault(a => a.GetName().Name == assemblyName);
          return assembly != null ? assembly.GetTypes().SingleOrDefault(t => t.Name == typeName) : null;
      }
      
      你可以称之为:

      Type dotNetType = FindType("dotnet-type", "dotnetassembly");
      
      这样,您就独立于类型名称空间

      另外,如果该程序集中有两个名称相同的类型,则此方法将无法工作,因为它无法知道返回哪种类型(事实上,它将引发异常)。您可以将
      SingleOrDefault
      更改为
      FirstOrDefault
      ,并使其返回第一个出现的类型


      当然,您将失去所有编译器时间优势,因为您将在运行时查找类型。

      完成这项任务将是一项非常艰巨的任务。您必须编写代码,可以进行某种反编译并解析结果,以找到您要查找的内容。当然,重新编译代码。假设任何其他的事情都是可能的,而实际的事情都是毫无意义的,毫无成效的。微软在这种胡言乱语上下了很大的功夫。如果你想使用反射,那么这里没有人会阻止你。同意其他评论。你可以,但我宁愿和选择更改名称空间的人谈谈。哈哈……这太过分了F不要更改代码和修改名称空间。如果程序集中有多个类型具有相同的
      typeName
      ,该怎么办?这是一个好问题。我应该澄清这对具有相同名称的类型不起作用。