在C#中键入命名空间问题

时间:2016-07-01 21:18:01

标签: c# .net

我有第三方.Net程序集让我们说ThridParty.dll使用来自.Net程序集dotnetassembly.dll的类型" dotnet-namespace.dotnet-type。 现在新版本的dotnetassembly.dll" dotnet-type"在dotnet-namespace中早期已被移动到新的命名空间让我们说new-dotnet-namespace。 dotnet-type的完全限定名称已成为new-dotnet-namespace.dotnet-type。

现在我的问题是,有什么方法可以告诉运行时在新命名空间中查找类型dotnet-type,即new-dotnet-namespace而不是旧命名空间,即dotnet-namespace?

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

2 个答案:

答案 0 :(得分:3)

不,.Net Framework中没有任何内容可以将一种类型重定向到另一种类型。

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

解决方案:

  • 重新编译
  • 构建代理程序集
  • 重写IL以指向新类型。

答案 1 :(得分:0)

怎么样:

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并使其返回第一次出现。

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