如何动态新的匿名类? [英] How to dynamic new Anonymous Class?
问题描述
在C#3.0,你可以创建匿名类用下面的语法
In C# 3.0 you can create anonymous class with the following syntax
var o1 = new { Id = 1, Name = "Foo" };
有没有一种方法来动态创建这些匿名类给一个变量?
Is there a way to dynamic create these anonymous class to a variable?
例如:
var o1 = new { Id = 1, Name = "Foo" };
var o2 = new { SQ = 2, Birth = DateTime.Now };
动态创建实例:
Dynamic create Example:
var o1 = DynamicNewAnonymous(new NameValuePair("Id", 1), new NameValuePair("Name", "Foo"));
var o2 = DynamicNewAnonymous(new NameValuePair("SQ", 2), new NameValuePair("Birth",
DateTime.Now));
怎么一回事,因为我需要做的:
Beacuse I need to do:
dynamic o1 = new ExpandObject();
o1."ID" = 1; <--"ID" is dynamic name
o1."Name" = "Foo"; <--"Name" is dynamic name
和场景1:
void ShowPropertiesValue(object o)
{
Type oType = o.GetType();
foreach(var pi in oType.GetProperties())
{
Console.WriteLine("{0}={1}", pi.Name, pi.GetValue(o, null));
}
}
如果我称之为:
dynamic o1 = new ExpandObject();
o1.Name = "123";
ShowPropertiesValue(o1);
它不能显示结果:
It can't show the result:
Name = 123
同时,我如何将ExpandoObject转换为AnonymouseType?
And also I how to Convert the ExpandoObject to AnonymouseType ?
Type type = o1.GetType();
type.GetProperties(); <--I hope it can get all property of o1
最后,我修改ShowPropertiesValue()方法
Last, I modify ShowPropertiesValue() method
void ShowPropertiesValue(object o)
{
if( o is static object ) <--How to check it is dynamic or static object?
{
Type oType = o.GetType();
foreach(var pi in oType.GetProperties())
{
Console.WriteLine("{0}={1}", pi.Name, pi.GetValue(o, null));
}
}
else if( o is dynamic object ) <--How to check it is dynamic or static object?
{
foreach(var pi in ??? ) <--How to get common dynamic object's properties info ?
{
Console.WriteLine("{0}={1}", pi.Name, pi.GetValue(o, null));
}
}
}
如何实现DynamicNewAnonymous方法或如何修改ShowPropertiesValue()?
How to implement DynamicNewAnonymous method or how to modify the ShowPropertiesValue()?
我的动机是:
dynamic o1 = new MyDynamic();
o1.Name = "abc";
Type o1Type = o1.GetType();
var props = o1Type.GetProperties(); <--I hope can get the Name Property
如果我能勾dynamicObject的GetType方法,并迫使转换为强类型的类型。
上述无缝code能正常工作。
If i can hook dynamicObject's GetType Method, and Compel convert to strongly-typed Type. The above Seamless code can work fine.
推荐答案
匿名类型只是普通类型的隐式声明。他们有一点做与动态
。
Anonymous types are just regular types that are implicitly declared. They have little to do with dynamic
.
现在,如果你使用的<一个href=\"http://msdn.microsoft.com/en-us/library/system.dynamic.expandoobject%28VS.100%29.aspx\">ExpandoObject并引用它通过动态
变量,你可以在飞行中添加或删除字段。
Now, if you were to use an ExpandoObject and reference it through a dynamic
variable, you could add or remove fields on the fly.
的修改的
当然,你可以:只需将它转换为的IDictionary&LT;字符串对象&gt;
。然后你可以使用索引。
Sure you can: just cast it to IDictionary<string, object>
. Then you can use the indexer.
您使用相同的铸造技术来遍历字段:
You use the same casting technique to iterate over the fields:
dynamic employee = new ExpandoObject();
employee.Name = "John Smith";
employee.Age = 33;
foreach (var property in (IDictionary<string, object>)employee)
{
Console.WriteLine(property.Key + ": " + property.Value);
}
// This code example produces the following output:
// Name: John Smith
// Age: 33
以上code和更可以通过点击该链接上找到。
The above code and more can be found by clicking on that link.
这篇关于如何动态新的匿名类?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!