日期:2014-05-18  浏览次数:21290 次

C# 动态创建类的问题
各位大侠,小弟有个关于C#动态创建类的问题请教:

  小弟自行开发一个winform的软件,使用C#写代码,程序里面需要用到一个对象,该对象的属性字段是用户自行定义的(例如:1、学校 字符类型,2、班级 字符类型,3、学生姓名 字符类型…………)

  现在的问题是:
  1、动态创建类的设计思路是否正确?

  1、使用C#能否简单的动态创建类并直接编译使用(使用new创建)?

  2、能否使用什么办法直接修改一个类的属性字段?

小弟在此拜谢!

------解决方案--------------------
要用到反射吧
------解决方案--------------------
动态创建类的办法也有,就是你用程序控制用户添加字段,然后动态生成这个类的代码,之后动态编译,最后反射调用

不知道需求不能说你的设计思想是否正确,只能告诉你很难或很麻烦
不如设计一个通用的类,这个类里包含一个字段的集合,每个字段类包含字段名称、字段类型、描述等属性,这样应该可以满足你的需求
------解决方案--------------------
要实现楼主所说的动态创建类需要使用MSIL语言,有一定的难度啊。所以还是考虑使用其他方法解决这个问题吧,为什么要动态修改类的属性呢?类没有设计好吧,用个数组属性不就OK了?
------解决方案--------------------
换个思路,别给自己找别扭
------解决方案--------------------
探讨
要实现楼主所说的动态创建类需要使用MSIL语言,有一定的难度啊。所以还是考虑使用其他方法解决这个问题吧,为什么要动态修改类的属性呢?类没有设计好吧,用个数组属性不就OK了?

------解决方案--------------------
探讨
该对象的属性字段是用户自行定义的

------解决方案--------------------
sp1234说的对。
这个C#目前不支持。
如果这样的话,可以用类似于List或Table之类来实现相应的权变。
复杂一点的话可能定义一些协议或规则来实现。
如:用户定义的相关“字段”,都存在XML中,然后用引擎解析到表(如:List\HashTable等)
------解决方案--------------------
可能是你需求分析出了问题,这种动态类是很麻烦的

建议你自定义一个类,把需要用户自定义的类型,设计成n个数组。
string的数组
int的数组
bool的数组
然后建一个二维数组记录关系
------解决方案--------------------
你去研究一下工厂模式吧..
------解决方案--------------------
javascript可能会适合楼主
------解决方案--------------------
可以用反射,不过是以牺牲性能为代价

这基本是动态语言的特征了,现在C#始终是强类型的,只不过考虑到实际运用中尽可能更灵活,才逐步加入了很多动态语言的特性,但其实还是静态类型的语言
------解决方案--------------------
先说说你的功能需求? 真的需要动态创建类吗?
.net 支持动态执行 代码

using System;
using System.Reflection;
using Microsoft.CSharp;
using System.CodeDom.Compiler;
using System.Text;
/// <summary>
/// 动态执行代码
/// </summary>
public class Evaluator
{
public static bool GetWhereReturn(string conditionOne, string conditionTwo)
{
// 1.CSharpCodePrivoder 创建编译器实例访问
CSharpCodeProvider objCSharpCodePrivoder = new CSharpCodeProvider();

// 2.ICodeComplier 创建编译器的CodeDom树
ICodeCompiler objICodeCompiler = objCSharpCodePrivoder.CreateCompiler();

// 3.CompilerParameters 设置编译器的参数
CompilerParameters objCompilerParameters = new CompilerParameters();
objCompilerParameters.ReferencedAssemblies.Add("System.dll");
objCompilerParameters.GenerateExecutable = false;
objCompilerParameters.GenerateInMemory = true;

// 4.CompilerResults 获取编译器的结果
CompilerResults cr = objICodeCompiler.CompileAssemblyFromSource(objCompilerParameters, GenerateCode(conditionOne, conditionTwo));
//判断编译错误是否有错误,如果有直接返回false,否则通过反射读取程序集中的公用方法
if (cr.Errors.HasErrors)
{
return false;
}
else
{
// 通过反射,获取编译器编译的程序集 
Assembly objAssembly = cr.CompiledAssembly;
//通过程序集创建对象
object objRun = objAssembly.CreateInstance("Run");