• 全部
  • C#综合技术
  • C#互联网桌面应用
  • AppLauncher
  • WinForm&WPF
  • C#开发新技术
  • 问答

用c#如何动态创建类?

友天下@277923869 北京世商互联科技有限公司 2005-09-16 12:14:00
类的名称是字符串,如何通过字符串动态创建类?
...全文
1709 点赞 收藏 14
写回复
14 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
ahcsdn 2006-03-31
关注
回复
谢谢大家,linuxyf(率人哥哥) :我没有收到你的邮件呀,麻烦再发一份,谢谢。

另外如何给大家加分呀?
回复
2021‘someday 2005-09-20
ding
回复
agree_able 2005-09-20
up
回复
zxilu 2005-09-20

能否也给我一份?先谢了!
回复
linuxyf 2005-09-20
楼主,我已经给你发了邮件,关于动态编译的,请查收.
回复
lovewindy 2005-09-17
用反射,System.Reflection里面有你需要的
回复
pnetsoft 2005-09-16
using System;
using System.Reflection;

namespace DynamicCall
{
/// <summary>
/// Class1 的摘要说明。
/// </summary>
public class Class1
{
public static void Main(string[] args)
{
Calc calc;

string typeName = typeof (Calc).FullName;

Type type = null;
foreach (Assembly assembly in AppDomain.CurrentDomain.GetAssemblies())
{
type = assembly.GetType(typeName);
if (type != null)
{
break;
}
}

if (type != null)
{
calc = (Calc) type.Assembly.CreateInstance(typeName);
}
else
{
return;
}

BindingFlags flags;

//设置Name属性
flags = BindingFlags.SetProperty;
type.InvokeMember("Name", flags, null, calc, new object[] {"My name is wql"});

//获得Name属性
flags = BindingFlags.GetProperty;
string name = (string) type.InvokeMember("Name", flags, null, calc, null);
Console.WriteLine(name);

//增加事件
flags = BindingFlags.InvokeMethod;
OnAddEvent eventProc = new OnAddEvent(calc_AfterAdd);
type.InvokeMember("add_AfterAdd", flags, null, calc, new object[] {eventProc});

//调用Add方法
int a = 3;
int b = 2;
flags = BindingFlags.InvokeMethod;
type.InvokeMember("Add", flags, null, calc, new object[] {a, b});

//calc["Name"] = "zyn";
//Console.WriteLine(calc.Name);

Console.WriteLine(GetProperty(calc, "Name"));
}

private static void calc_AfterAdd(int a, int b, int result)
{
Console.WriteLine("calc_AfterAdd:a={0},b={1},result={2}", a, b, result);
}

public static object GetProperty(object obj, string propName)
{
BindingFlags flags = BindingFlags.GetProperty;
return obj.GetType().InvokeMember(propName, flags, null, obj, null);
}
}

public delegate void OnAddEvent(int a, int b, int result);

public class Calc
{
private string name;
private int count = 0;

// public string this[string propName]
// {
// get
// {
// BindingFlags flags = BindingFlags.GetProperty;
// string value =(string) this.GetType().InvokeMember(propName, flags, null, this, null);
// return value;
// }
// set
// {
// BindingFlags flags = BindingFlags.SetProperty;
// this.GetType().InvokeMember(propName, flags, null, this, new object[]{value});
// }
// }

public int Add(int a, int b)
{
count ++;
int result = a + b;
this.FireOnAddEvent(a, b, result);
return result;
}

public int Count
{
get
{
return this.count;
}
}

public string Name
{
get
{
return this.name;
}
set
{
this.name = value;
}
}

public event OnAddEvent AfterAdd;

private void FireOnAddEvent(int a, int b, int result)
{
if (this.AfterAdd != null)
{
this.AfterAdd(a, b, result);
}
}

public override string ToString()
{
return string.Format("{0}[{1}]", this.GetType().FullName, this.name);
}

}
}
回复
2021‘someday 2005-09-16
上面的可以吧
回复
长江支流 2005-09-16
根据楼主的需求,是用c#如何根据类名动态创建类的实例。

楼主用反射就可以了,所有类在一个程序集中,楼主可查Assembly,它的命名空间为System.Reflection。

下面以实例一个已存在的窗口(类)为例,根据窗口名创建它的实例并调用它的方法。
如在Form1中的按钮中,相显示Form2,如下:

private void btnShow_Click(object sender, System.EventArgs e)
{
Type type = Type.GetType("ReflectionTest.Form2");

System.Reflection.Assembly a = System.Reflection.Assembly.GetAssembly(type);

//根据名称创建对象实例
Object obj = a.CreateInstance("ReflectionTest.Form2");

//调用对象方法或属性等
type.InvokeMember("Show",System.Reflection.BindingFlags.InvokeMethod,null,obj,null);

}
回复
zhaoliang_chen 2005-09-16
mark
回复
linuxyf 2005-09-16
动态创建类,动态编译也是可以的,System.CodeDom和System.CodeDom.Compiler命名空间的一些类可以完成你的需要。
回复
linuxyf 2005-09-16
你的意思应该是动态地创建对象吧?
用反射

assembly.CreateObject()
回复
sdd330 2005-09-16
using System;

namespace MyClassLib
{
class MyClass{
public int a;

public int GetSum(int x, int y) {
return x + y + a;
}

}
}

class ReflectionHelper {

public static object SetValue(string p_ClassName, string p_FieldName, string p_FieldValue) {
// 加载程序集
Assembly _Assembly = Assembly.LoadFrom("MyClassLib.dll");

// 加载类型
Type _Type = _Assembly.GetType(p_ClassName);

// 创建实例
Object _Object = System.Activator.CreateInstance(_Type);

// 取属性
FieldInfo _FieldInfo = _Type.GetField(p_FieldName);

// 类型转换
Object _Value = System.Convert.ChangeType(p_FieldValue, _FieldInfo.FieldType);

// 设值
_FieldInfo.SetValue(_Object, _Value);

#region 方法调用
// 给参数
System.Type[] _ParamTypes = new System.Type[2];
_ParamTypes[0] = System.Type.GetType("System.Int32");
_ParamTypes[1] = System.Type.GetType("System.Int32");

// 取方法信息
MethodInfo _MethodInfo = _Type.GetMethod("GetSum", _ParamTypes);

// 参数值
Object[] _Params = new Object[2];
_Params[0] = 3;
_Params[1] = 4;

//
Object _ReturnValue = _MethodInfo.Invoke(_Object, _Params);

Console.WriteLine("MyClassLib.MyClass.GetSum(3, 4) returns: {0}", _ReturnValue.ToString());
#endregion

return _Object;
}

static void Main() {
Object o = SetValue("MyClassLib.MyClass","a","12");
Console.WriteLine(o.GetType().Name);
Console.WriteLine(o.GetType().GetField("a").GetValue(o));
Console.WriteLine(o.GetType().GetField("a").GetValue(o).GetType().Name);
Console.ReadLine();
}
}
回复
相关推荐
C#动态创建类
C#动态创建类 public static void CreatNewClass(int i, int j) { StringBuilder sbCode = new StringBuilder(); sbCode.AppendLine("using System;"); sbCode.AppendLine("namespace Entity"); sbCode.Append...
C#在运行时动态创建类型的实现方法
主要介绍了C#在运行时动态创建类型的实现方法,主要通过动态生成C#代码再编译成程序集来实现动态创建类型的,需要的朋友可以参考下
.net c#动态创建程序集、、属性、方法等
.net c#动态创建程序集、、属性、方法等 参考文章 http://hi.baidu.com/live36524/blog/item/5cbba22b4716cb87033bf6b3.html
C# 动态创建一个
C# 在运行时动态的创建类型是通过动态生成C#源代码,然后通过编译器编译成程序集的方式实现动态创建类型的。 主要功能代码如下: public static Assembly NewAssembly() {  //创建编译器实例。  ...
C#动态创建button按钮的方法实例详解
主要介绍了C#动态创建button按钮的方法实例详解的相关资料,需要的朋友可以参考下
C#动态创建Access数据库及表的方法
本文实例讲述了C#动态创建Access数据库及表的方法。分享给大家供大家参考。 具体实现方法如下: 代码如下: //添加两个com组件引用 //Microsoft ADO Ext. 2.8 for DDL and Security //Microsoft ActiveX Data ...
C#如何动态的创建带参数的构造函数的,将作为变量动态创建
C#如何动态的创建带参数的构造函数的,将作为变量动态创建 本文章,Jemi会教大家如何动态的创建并使用一个。 1)申明两个 2)使用Type 和Activator.CreateInstance(type, parameters)动态创建带构造函数的...
C#动态执行字符串(动态创建代码)的实例代码
在编写C#程序的时候,有时我们需要动态生成一些代码并执行。然而C#不像JavaScript有一个Eval函数,可以动态的执行代码。所有这些功能都要我们自己去完成
c# asp .net 动态创建sql数据库表的方法
c# asp .net 动态创建sql数据库表的方法,需要的朋友可以参考一下
C#动态创建实例
C#中的动态创建实例依赖的是反射机制,通俗点来说就是通过字符串类型的命名空间与类名来找到该。从而对该进行一系列的操作。 (只介绍两种常用的方法,有很多重载,大家可以自己尝试) 创建的API主要就是以下两...
C#动态创建Access数据库及密码的方法
同为微软的产品,本文将讨论的是C#如何创建Access数据库,同时创建数据库密码与相关操作,希望对大家有所帮助。
C# winform动态创建和关闭多线程源码 可运行
C# winform 动态创建和 关闭多线程,基于VS2010的完整解决方案。 可运行
C#动态创建和动态使用程序集、、方法、字段等.pdf
C#动态创建和动态使用程序集、、方法、字段等.pdf
C# 动态创建控件以及添加控件的响应事件
C# 实现控件的动态创建 以及 添加控件的事件响应。能够动态控制动态生成控件的个数,其中还包括父窗口与子窗口的交互操作,子窗口相对父窗口的居中显示。 代码详细,VS2008编程环境,可以直接运行。
C# 动态创建委托
/// <summary> /// 动态创建委托 /// </summary> public class CreateDelegateHelper { /// <summary> /// 创建委托 /// </summary> /// <p...
C#动态创建button的方法
主要介绍了C#动态创建button的方法,涉及C#按钮属性动态设置的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
C#动态创建TXT文件并写入内容
内容索引:C#源码,文件操作,TXT,数据流 C#动态创建文件并写入内容,这里主要是创建TXT文件,当然其它格式的文件也可以创建,您只需更改扩展名即可。本程序用到的主要是流的操作,流是一种快速读取文件的数据形式。...
C# 实现动态创建控件 调整大小 拖动 自适应窗体
C# 实现动态创建控件 调整大小 拖动 自适应窗体 可以进行微调,需要创建之后进行绑定操作。
C#动态创建类实例并调用
C#动态创建类实例并调用
c#使用动态类的样例程序
C#中如何使用动态类创建使用动态属性和方法的样例程序。
c#动态创建数组
变相创建 publicdouble[,]setArray(stringi,stringj) { //可以先对i和j做数字判断。 returnnewdouble[int.Parse((i!=""?i:"1")),int.Parse((j!=""?j:"1"))]; } ...
C#实现动态生成表格的方法
主要介绍了C#实现动态生成表格的方法,是C#程序设计中非常实用的技巧,需要的朋友可以参考下
C#动态创建文件并写入内容
C#动态创建文件并写入内容 轻松方便 Form页面 快速
C#动态创建控件并绑定事件
C#动态创建控件并绑定事件 private void Form1_Load(object sender, EventArgs e) { for (int i = 0; i < 5; i++) { Button btn = new Button(); //创建对象 ...
C#动态创建窗口和创建事件,在新窗口添加控件和控件事件
C#动态创建窗口和创建事件,在新窗口添加控件和控件事件
动态生成 动态类 动态属性
写的一个帮助器,思路是,可以使用这个帮助器对类动态地控制(在运行时),如添加,删除其成员。 最近要用到这个,在网上找了点资料,也不全面,就自己查msdn帮助文件。自己写了一个,功能还不是很完善,如果大家...
C#动态创建
SqlConnection conn = new SqlConnection(); conn.ConnectionString = ""; conn.Open(); SqlCommand cmd = new SqlCommand(); cmd.Connection = conn; cmd.CommandText = " ...if exists (select * from dbo....
FFmpegAndroidDemo.zip
ffmpeg-3.3.1移植到android平台
光模块基础知识
光模块内部发射与接收的专业讲解,利于新手快速开发。
android 登陆界面例子
android 登陆界面例子 可以直接运行的
发帖
C#
创建于2007-09-28

10.5w+

社区成员

.NET技术 C#
申请成为版主
帖子事件
创建了帖子
2005-09-16 12:14
社区公告

让您成为最强悍的C#开发者