zoukankan      html  css  js  c++  java
  • Type.GetType()反射另外项目中的类时返回null的解决方法

    项目1:ProjectA

    namespace ProjectA

    {

    public class paa

    {

    ....

    }

    }

    Type.GetType("paa")返回null

    Type.GetType("ProjectA.paa")返回正确

    项目2:ProjectB

    引用了ProjectA

    Type.GetType("ProjectA.paa")返回空值

    Type.GetType("ProjectA.paa,ProjectA")返回正确

    ,ProjectA 是引用程序集的名称,也就是程序集的项目名称。

    另一篇,

    在开发中,经常会遇到这种情况,在程序集A.dll中需要反射程序集B.dll中的类型。如果使用稍有不慎,就会产生运行时错误。例如使用Type.GetType("BNameSpace.ClassName")在程序集A.dll获取程序集B.dll中的类型,就会返回Null。

    关于跨程序集的反射,有两点需要注意:

    1、如果使用typeof,编译能通过,则跨程序集的反射一定可以正常运行。可以说,typeof是支持强类型的。比如

     Type supType = typeof(BNameSpace.SubSpace.Class);


    如果当前程序集没有添加对EnterpriseServerBase.dll的引用,则编译会报错。

    2、如果使用Type.GetType来进行反射的话,情况就复杂些。这是因为Type.GetType是非强类型的。Type.GetType的参数是一个string为类型的完全限定名,如果当string表示的目标类型不在当前程序集中,则运行时Type.GetType会返回null。解决的办法是:首先加载目标程序集,然后再使用Assembly.GetType方法来获取类型。如

    1.  
      Assembly asmb = Assembly.LoadFrom("EnterpriseServerBase.dll") ;
    2.  
      Type supType = asmb.GetType("EnterpriseServerBase.DataAccess.IDBAccesser") ;

    注意,当使用Type.GetType的时候,即使你添加了对EnterpriseServerBase.dll的引用,Type.GetType("EnterpriseServerBase.DataAccess.IDBAccesser")也会返回null,这是因为Type.GetType只会在当前程序集中进行类型搜索!

    下一篇是反射实力,根据DB中的字符串处理类来生成该字符串标识的类的实例,

    public static ISignedDocumentGenerator GetSignedDocumentGenerator(int docID)
    {
    lock (locker)
    {
    if (GeneratorDic.ContainsKey(docID))
    return GeneratorDic[docID];

    var templateName = getTemplateName(docID);

    if (string.IsNullOrEmpty(templateName))
    throw new NullReferenceException("无法获取DocID = " + docID + "的FileTemplateName。");

    var typeName = "TCC.MCI.BizPro.Document.Generator." + templateName;
    var typeFullName = "TCC.MCI.BizPro.Document.Generator." + templateName + ", TCG.MCI.BizProcess";
    var type = Type.GetType(typeFullName);
    if (type == null)
    throw new NullReferenceException("无法获取类型名称为:" + typeFullName + "的类型。");

    var instance = type.Assembly.CreateInstance(typeName) as ISignedDocumentGenerator;

    if (instance == null)
    throw new NullReferenceException("创建ISignedDocumentGenerator对象失败,类型名称为:" + typeName);

    GeneratorDic.Add(docID, instance);

    return GeneratorDic[docID];
    }
    }

  • 相关阅读:
    POJ 3672 水题......
    POJ 3279 枚举?
    STL
    241. Different Ways to Add Parentheses
    282. Expression Add Operators
    169. Majority Element
    Weekly Contest 121
    927. Three Equal Parts
    910. Smallest Range II
    921. Minimum Add to Make Parentheses Valid
  • 原文地址:https://www.cnblogs.com/itjeff/p/9322565.html
Copyright © 2011-2022 走看看