joe*_*iks 9 c# dynamic object-initializers
我试图在c#中使用DynamicObject,我需要一个动态数组:
var d = new dynamic[];
Run Code Online (Sandbox Code Playgroud)
哪个工作正常.
编辑:请参阅下面的ExpandoObject.
但我也想用这个压缩的初始化新语法用一些数据填充该数组:
var d = new dynamic[] {
new {
Name = "Some",
Number = 1010
},
new {
Name = "Other",
Number = 2010
}
}
Run Code Online (Sandbox Code Playgroud)
但在这种情况下,所有对象都获得非动态类型"对象",并且通过项目的循环将给出一个例外:
foreach (dynamic item in d)
{
@item.Name
@item.Number
}
Run Code Online (Sandbox Code Playgroud)
错误:'object'不包含'Name'的定义.我想我只是以错误的方式初始化数组项.如何添加动态对象?
编辑:新内容:
我意识到"动态"没有动态添加属性的能力.
我最好使用ExpandoObject,它将内部字典中的所有项目公开为属性.但不幸的是,ExpandoObject似乎不支持这种漂亮的压缩创建语法,编译器抱怨:
var d = new ExpandoObject[]{
new ExpandoObject(){
Name="Nnn",
Number=1080
}
}
Run Code Online (Sandbox Code Playgroud)
所以答案可能只是:这是不可能的.
希望你真的不需要动力学
class Program
{
static void Main(string[] args)
{
var d = new[]
{
new
{
Name = "Some",
Number = 1010
},
new
{
Name = "Other",
Number = 2010
}
};
foreach (var item in d)
{
string s = @item.Name;
int n = @item.Number;
Console.WriteLine("{0} {1}", s, n);
}
}
}
Run Code Online (Sandbox Code Playgroud)
小智 5
我来晚了一点,但这是我发现的:
如果我不能初始化ExpandoObject,那么用动态类型初始化它怎么样?
所以我做了以下扩展方法
public static ExpandoObject CreateExpando(this object item)
{
var dictionary = new ExpandoObject() as IDictionary<string, object>;
foreach (var propertyInfo in item.GetType().GetProperties())
{
dictionary.Add(propertyInfo.Name, propertyInfo.GetValue(item, null));
}
return (ExpandoObject)dictionary;
}
Run Code Online (Sandbox Code Playgroud)
我知道它远非理想,但它是我现在可以实现的最好的,它的工作原理如下:
var myExpandoObject = new { Name="Alex", Age=30}.CreateExpando();
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
13067 次 |
最近记录: |