Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C语言中的动态类创建#_C#_Class_Dynamic - Fatal编程技术网

C# C语言中的动态类创建#

C# C语言中的动态类创建#,c#,class,dynamic,C#,Class,Dynamic,是否可以在运行时从DataTable创建一个类,其中ColumnName将是动态类属性?是(使用Reflection.Emit),但这不是一个好主意。 你想干什么?读了你的评论,我理解了你的意思。 只需使用泛型:使用列表字段生成对象。 代码非常简单: public class DynClass<T, P> { public DynClass() { _fields = new Dictionary<T, P>

是否可以在运行时从DataTable创建一个类,其中ColumnName将是动态类属性?

是(使用Reflection.Emit),但这不是一个好主意。

你想干什么?

读了你的评论,我理解了你的意思。 只需使用泛型:使用列表字段生成对象。 代码非常简单:

public class DynClass<T, P>
    {
        public DynClass()
        {
            _fields = new Dictionary<T, P>();
        }

        private IDictionary<T, P> _fields;

        public IDictionary<T, P> Fields
        {
            get { return _fields; }
        }

    }

    public class TestGenericInstances
    {
        public TestGenericInstances()
        {
            Client cli = new Client("Ash", "99999999901");

            /* Here you can create any instances of the Class. 
             * Also DynClass<string, object>
             * */
            DynClass<string, Client> gen = new DynClass<string, Client>();

            /* Add the fields
             * */
            gen.Fields.Add("clientName", cli);

            /* Add the objects to the List
             * */
            List<object> lstDyn = new List<object>().Add(gen);
        }        
    }
公共类动态类
{
公共动态类()
{
_字段=新字典();
}
私有IDictionary_字段;
公共索引字段
{
获取{return\u fields;}
}
}
公共类TestGenericInstances
{
公共TestGenericInstances()
{
客户端cli=新客户端(“Ash”,“999999999 01”);
/*在这里,您可以创建该类的任何实例。
*还包括DynClass
* */
DynClass gen=新的DynClass();
/*添加字段
* */
gen.Fields.Add(“clientName”,cli);
/*将对象添加到列表中
* */
List lstDyn=新列表()。添加(gen);
}        
}
如果您有C#4,您可以利用新的动力学功能和
ExpandoObject
。你可以。

使用C#4,你可以做到这一点

dynamic foo = new ExpandoObject();

// mimic grabbing a column name at runtime and adding it as a property
((IDictionary<string, object>)foo).Add("Name", "Apple");

Console.WriteLine(foo.Name); // writes Apple to screen
dynamic foo=new ExpandoObject();
//模拟在运行时获取列名并将其添加为属性
添加(“名称”、“苹果”);
Console.WriteLine(foo.Name);//把苹果写到屏幕上

不推荐它或任何东西,但它向您展示了它是可能的。

我将研究前面提到的ExpandoObject(顺便说一句,我投票赞成该解决方案,因为它似乎更容易),但是的,它是可能的。我正在我的一个项目中构建一个类,其中第三方实用程序需要将CSV行定义为类

您可以生成代码(我包括了\r\n以便读取结果代码):

。。。 就像我提到的,如果我必须重新做一次,我会研究ExpandooObject,但是从DataTable创建一个类是绝对可能的。您需要查询列名来构建字段;我的示例中有一个“,”分隔字符串提供的列名列表


我的示例来自一个非常具体的用例,但如果ExpandoObject不适合您,它应该足以让您继续使用。

为什么?你想做什么?你是说定义一个新类,还是动态设置一个现有的类属性?我想用dataTable列名称创建一个新类为什么不能在设计时创建这些类?我刚刚在帖子中添加了代码。抱歉,如果你已经看到我有RadGridView,当我使用dataTable作为他的源时,它有一些问题。但当我使用列表时,一切都很好。有什么想法吗?你应该把它作为一个单独的问题来问。使用这项技术真是不可思议!每次我都可以有不同名称和类型的不同列。你能详细地告诉我你的变体吗,或者给我看一段代码吗?
        string code = "using FileHelpers;\r\n\r\n";

        code += "[DelimitedRecord(\"" + delimiter + "\")]\r\n";
        code += "public class CustomCSVInputFile ";
        code += "{ \r\n";

        foreach (string column in columnList)
        {
          code += "   public string " + column.Replace(" ", "") + ";\r\n";
        }
        code += "}\r\n";

        CompilerResults compilerResults = CompileScript(code);
    public static CompilerResults CompileScript(string source)
    {
        CompilerParameters parms = new CompilerParameters();
        FileHelperEngine engine;

        parms.GenerateExecutable = false;
        parms.GenerateInMemory = true;
        parms.IncludeDebugInformation = false;

        string path = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase).Replace("file:\\", "").Trim();

        parms.ReferencedAssemblies.Add(Path.Combine(path, "FileHelpers.dll"));

        CodeDomProvider compiler = CSharpCodeProvider.CreateProvider("CSharp");

        return compiler.CompileAssemblyFromSource(parms, source);
    }