Как создать динамический новый анонимный класс?
в C# 3.0 вы можете создать анонимный класс со следующим синтаксисом
var o1 = new { Id = 1, Name = "Foo" };
есть ли способ динамического создания этих анонимных классов для переменной?
пример:
var o1 = new { Id = 1, Name = "Foo" };
var o2 = new { SQ = 2, Birth = DateTime.Now };
динамическое создание пример:
var o1 = DynamicNewAnonymous(new NameValuePair("Id", 1), new NameValuePair("Name", "Foo"));
var o2 = DynamicNewAnonymous(new NameValuePair("SQ", 2), new NameValuePair("Birth",
DateTime.Now));
потому что мне нужно сделать:
dynamic o1 = new ExpandObject();
o1."ID" = 1; <--"ID" is dynamic name
o1."Name" = "Foo"; <--"Name" is dynamic name
И Scene1:
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);
он не может показать результат:
Name = 123
а также я как конвертировать ExpandoObject в AnonymouseType ?
Type type = o1.GetType();
type.GetProperties(); <--I hope it can get all property of o1
наконец, я изменяю метод ShowPropertiesValue ()
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 ()?
мои мотивы-это:
dynamic o1 = new MyDynamic();
o1.Name = "abc";
Type o1Type = o1.GetType();
var props = o1Type.GetProperties(); <--I hope can get the Name Property
если я могу подключить метод gettype dynamicObject и принудительно преобразовать в строго типизированный тип. Приведенный выше бесшовный код может работать нормально.
2 ответа:
анонимные типы-это просто обычные типы, которые неявно объявлены. Они имеют мало общего с
dynamic
.теперь, если вы должны были использовать ExpandoObject и ссылаться на него через
dynamic
переменная, вы можете добавлять или удалять поля на лету.edit
конечно, вы можете просто бросить его в
IDictionary<string, object>
. Затем вы можете использовать индексатор.вы используете тот же метод литья, чтобы перебирать поля:
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
приведенный выше код и многое другое можно найти, нажав на эту ссылку.
вы можете создать ExpandoObject следующим образом:
IDictionary<string,object> expando = new ExpandoObject(); expando["Name"] = value;
и после приведения его к динамическому, эти значения будут выглядеть как свойства:
dynamic d = expando; Console.WriteLine(d.Name);
однако они не являются фактическими свойствами и не могут быть доступны с помощью отражения. Таким образом, следующий оператор вернет null:
d.GetType().GetProperty("Name")