如何在 C#下利用反射动态创建对象

如题... 如题 展开
 我来答
匿名用户
推荐于2017-05-26
展开全部
得到目标类的类型
反射类
/// <summary>
/// 作者:武广敬
/// Blog:tonyepaper.cnblogs.com

///
/// 反射类
/// </summary>
public class MReference
{
/// <summary>
/// 得到类型
/// </summary>
/// <param name="consultClass">与要反射的类同一命名空间下的别一类型,用于得到完全限定名</param>
/// <param name="targetClassName">需要反射的类名</param>
/// <returns>反射得到的类型</returns>
public static Type getType(Type consultClass,string targetClassName)
{
//得到完全限定名
string assemblyQualifiedName = consultClass.AssemblyQualifiedName;
//从完全限定名的第一个逗号开始得到完全限定名的公共部份
string assemblyInformation = assemblyQualifiedName.Substring(assemblyQualifiedName.IndexOf(","));
try
{
//根据要反射的类名+截取后的限定名得到要反射类的类型
Type ty = Type.GetType(targetClassName + assemblyInformation);
return ty;
}
catch (Exception ex)
{
return null;
}

}
}

表单工厂
/// 作者:武广敬
/// Blog:tonyepaper.cnblogs.com
/// 表单工厂
/// </summary>
public class FormFactory
{
/// <summary>
/// 根据传入的数据库名,返回一个表单的实例
/// </summary>
/// <param name="tableName">数据库的表名</param>
/// <returns>与此表相对应的表单对象</returns>
public static Form GetInstance(string tableName)
{
//与目标对象类型相同命名空间的类型
Type sourceType = typeof(MasterSoft.WinUI.frmMain);
//目标对象类型全名(包括命名空间)
string className = "MasterSoft.WinUI.frm" + tableName;

//如果表名为空抛出异常
if (string.IsNullOrEmpty(tableName))
throw new ArgumentNullException("tableName");

return GetInstance(sourceType, className) as Form;
}
/// <summary>
/// 得到对象
/// </summary>
/// <param name="sourceType">与目标对象类型相同命名空间的类型</param>
/// <param name="className">//目标对象类型全名(包括命名空间)</param>
/// <returns>反射得到的对象</returns>
private static object GetInstance(Type sourceType, string className)
{
try
{
//根据传入的表名得到对应窗体的类型 MasterSoft.WinUI.frmMain是相同命名空间下的一个类型,用于得到限定名
Type ty = MReference.getType(sourceType, className);
if (ty == null)
throw new ArgumentNullException("ty");
//得到类型的 GetInstance 方法(当然这个类型必须有这个静态方法-单例模式)
MethodInfo getInstance = ty.GetMethod("GetInstance");
if (getInstance == null)
throw new ArgumentNullException("getInstance");
//调用GetInstance静态方法
object obj = (MdiChildEditForm)getInstance.Invoke(null, null);
//IMdiChildEditForm frm = ((IMdiChildEditForm)System.Activator.CreateInstance(ty)).GetInstance();
//返回得到的窗体
return obj;
}
catch (Exception ex)
{
throw ex;
}
}
}

调用方法
Form frm = (Form)FormFactory.GetInstance(tableName);
frm.Show();
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2013-08-11
展开全部
你说的如题,但是没有题目!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2013-08-11
展开全部
Assembly.Load(assemblyName).CreateInstance(className);
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式