动态创建C#类或对象

时间:2017-12-12 08:07:59

标签: c# dynamic properties

我有这种结构。

SQL> alter session set NLS_DATE_FORMAT = 'mm-dd-yyyy HH24:mi:ss';

Session altered.

SQL>   SELECT   TO_DATE ('1970-01-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS') + NUMTODSINTERVAL (15114212
11, 'second')  FROM DUAL;

TO_DATE('1970-01-01
-------------------
11-23-2017 07:13:31

我的问题是,我想为" Foo"创建属性。来自" GetFoo()"功能。同时,此函数返回" List" "富"类型。我研究"Dynamically Add C# Properties at Runtime""How to dynamically create a class in C#?"但这些链接中的答案未被引用为返回值或引用到另一个类。我怎么能这样做?

2 个答案:

答案 0 :(得分:1)

您可以使用任何其他属性动态创建继承Foo的类。因此,您可以将这些动态类的实例添加到List<Foo>

为此,可以生成如下代码字符串:

var bar1Code = @"
public class Bar1 : Foo
{
    public Bar1(int value)
    {
        NewProperty = value;
    }
    public int NewProperty {get; set; }
}
";

然后使用CSharpCodeProvider编译它:

var compilerResults = new CSharpCodeProvider()
    .CompileAssemblyFromSource(
        new CompilerParameters
        {
            GenerateInMemory = true,
            ReferencedAssemblies =
            {
                "System.dll",
                Assembly.GetExecutingAssembly().Location
            }
        },
        bar1Code);

然后,可以创建Bar1的实例,将其添加到List<Foo>,例如将其转换为动态以访问动态属性:

var bar1Type = compilerResults.CompiledAssembly.GetType("Bar1");
var bar2Type = compilerResults.CompiledAssembly.GetType("Bar2"); // By analogy

var firstClass = new FirstClass
{
    FooList = new List<Foo>
    {
        (Foo)Activator.CreateInstance(bar1Type, 56),
        (Foo)Activator.CreateInstance(bar2Type, ...)
    }
};

var dynamicFoo = (dynamic)firstClass.FooList[0];
int i = dynamicFoo.NewProperty; // should be 56

答案 1 :(得分:0)

为什么不使用Dictionary;

public class Foo
{
    public Dictionary<string, object> Properties;

    public Foo()
    {
        Properties = new Dictionary<string, object>();
    }
}
public List<Foo> GetFoo()
{
    var item = new Foo();
    item.Properties.Add("Name","Sample");
    item.Properties.Add("OtherName", "Sample");
    return new List<Foo>{ item };
}

在运行时为类添加属性,无法执行。