我的代码是
type = Type.GetType(key);
我传递的密钥是名称空间限定名称。
我的代码在BusinessLayer中。我正在创建DataAccessLayer的实例。 DataAccessLayer引用已添加到BusinessLayer。
我收到错误“无法从程序集'BusinessLayer,Version = 1.9.3.0,Culture = neutral,PublicKeyToken = null'加载类型'Catalyst.DAL.ExamDAO.CExamDAO'。”
如何明确指定该类来自DataAccessLayer?
Key vale是“Catalyst.DAL.ExamDAO.CExamDAO”
修改:
我的实际代码是
public static object getClassInstance(string key, params object[] constructorArgs)
{
string assemblyPath = null;
string customClassName = null;
DataSet objDataset = getAssemblyInfo(key);
if (objDataset != null && objDataset.Tables.Count > 0 && objDataset.Tables[0].Rows.Count > 0)
{
assemblyPath = objDataset.Tables[0].Rows[0]["ACA_ASSEMBLY_PATH"].ToString();
customClassName = objDataset.Tables[0].Rows[0]["ACA_CLASS_NAME"].ToString();
}
Assembly assembly;
Type type;
if (assemblyPath != null && assemblyPath != string.Empty)
{
assembly = Assembly.LoadFile(assemblyPath);
type = assembly.GetType(customClassName);
}
else // if no customisation
{
type = Type.GetType(key);
}
object classInstance = constructorArgs == null ? Activator.CreateInstance(type) : Activator.CreateInstance(type, constructorArgs);
if (classInstance == null) throw new Exception("broke");
return classInstance;
}
如果没有自定义,我正在尝试加载默认类。方法在BO中。 如果我将密钥作为任何Bo类型的名称空间限定名称传递,它将转换。但DAO类型它不会
答案 0 :(得分:3)
如果您知道它的任何类型都在DataAccessLayer
范围内,那么我会尽可能简单地获得Assembly
引用,例如
Assembly assembly = typeof(AnyPublicTypeWithinTargetAssembly).Assembly;
Type type = assembly.GetType(namespaceQualifiedTypeName);
另一种方法是将Type.GetType
与程序集限定的名称一起使用,但在指定类型名称方面更为冗长。
答案 1 :(得分:3)
如果调用程序集中不存在该类型,则需要使用AssemblyQualifiedName
来获取Type实例。要解决您的问题,您需要使用key
而不是AssemblyQualifiedName
设置namespace qualified name
值。
答案 2 :(得分:0)
如果CExamDAO
是ExamDao
的子类,那么表示法是(注意+
):
Catalyst.DAL.ExamDAO+CExamDAO
您可以做的最好的事情是直接创建CExamDAO,然后使用GetType().AssemblyQualifiedName
(例如在调试器中)。类似的东西:
(new CExamDAO()).GetType().AssemblyQualifiedName
或(如果你确定你需要的地方,它的装配已经加载了)
(new CExamDAO()).GetType().FullName
然后将其复制/粘贴到您的代码中。
答案 3 :(得分:0)
你的类型是公开的吗? 无法从不同的程序集加载内部类。
答案 4 :(得分:0)
或试试这个:
private static object GetResultFromStaticMethodClass(string qualifiedClassName, string method)
{
Type StaticClass = Type.GetType(qualifiedClassName);
MethodInfo methodInfo = StaticClass.GetMethod(method);
object result = methodInfo.Invoke(null, null);
return result;
}
使用:
object result = GetResultFromStaticMethodClass(
"Utilities.StringHelper,DaProject",
"ToList"
);
在实用程序类中,在实用程序命名空间中,在 DaProject 中调用 StringHelper 类中的静态方法 ToList 项目(相同的程序集和项目名称)。
如果您需要参数,请将它们添加到 methodInfo.Invoke(null,null)调用中的第二个参数