我有这种结构。
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#?"但这些链接中的答案未被引用为返回值或引用到另一个类。我怎么能这样做?
答案 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 };
}
在运行时为类添加属性,无法执行。