2015-02-06 21 views
0

实例使用C#反射/组装/ Activator对象我有一个命名空间中定义一个类(我将省略的代码):无法从字符串

namespace My.Business.Services 
{ 
    public class ProgressSender 
    { 
    } 
} 

该项目被保存为一个DLL。在我的解决方案中的另一个项目中,我尝试以各种方式安装它(实际上这是我的app.config中的一个字符串),但它们都失败了(它确实可以明确地在代码中早期绑定类)。我已经包括My.Business.Services作为参考程序太:

namespace My.Progress.Imaging 
{ 
    static class Program 
    { 
    static void Main(string[] args) 
    { 
     string exportItemNS = "My.Business.Services"; 
     string exportItemC = "ProgressSender"; 
     string exportItemFull = "My.Business.Services.ProgressSender"; 

     //value cannot be null 
     ProgressSender obj =  
     (ProgressSender)Activator.CreateInstance(Type.GetType(exportItemFull)); 

     //could not load type 'ProgressSender' from assembly 'My.Business.Services' 
     var obj=Activator.CreateInstance(exportItemNS, exportItemC); 

     //could not load type 'ProgressSender' from assembly 'My.Business.Services' 
     ProgressSender s=(ProgressSender)Activator.CreateInstance(null, exportItemFull); 

     //Loads ok but then classType is null 
     Assembly assembly; 
     assembly = Assembly.Load(exportItemNS); 
     Type classType = assembly.GetType(exportItemC); 

    } 
} 
} 

如果我得到相同的命名空间,甚至系统是一个类型的罚款:

Type t = Type.GetType("My.Progress.Imaging.Program"); 
t = Type.GetType("System.String"); 
+0

您是否还尝试过'assembly.GetType(exportItemFull)'? – SimpleVar 2015-02-06 19:03:10

回答

2

你需要指定完整的装配限定名称。只有mscorlib和系统类型可以提供不带程序集名称的类型名称。

所以你的情况:

“My.Business.Services.ProgressSender,My.Business.Services”

如果你的类型是在My.Business.Services.dll组装。

请参阅https://msdn.microsoft.com/en-us/library/system.type.assemblyqualifiedname(v=vs.110).aspx

+0

打了我一分钟。是的,需要知道(尤其是如果lib还没有加载)程序集就像类型一样。 – 2015-02-06 19:15:32

+0

谢谢。使用Assembly Load还是Activator更好?这工作,但没有其他方式,我宁愿不必将我的字符串分成命名空间和完整的类名后,从xml读取它 ProgressSender obj =(ProgressSender)Activator.CreateInstance(exporterItenNS,exportItemFull).Unwrap (); – 2015-02-06 19:26:24

+0

您已经将每种类型分开加载。如果你想避免真正的分裂,为什么不把它们全部保存为xml或json,你可以用'namespace'和'name'属性将它们作为单独的值来存储? – SimpleVar 2015-02-06 19:28:30