views:

76

answers:

2

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?


Example:

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

And 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));
  }
}

if I call:

dynamic o1 = new ExpandObject();
o1.Name = "123";
ShowPropertiesValue(o1);

It can't show the result:

Name = 123

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

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));
    } 
  }
}

How to implement DynamicNewAnonymous method or how to modify the ShowPropertiesValue()?

My motivations is:

dynamic o1 = new MyDynamic();
o1.Name = "abc";
Type o1Type = o1.GetType();
var props = o1Type.GetProperties(); <--I hope can get the Name Property

If i can hook dynamicObject's GetType Method, and Compel convert to strongly-typed Type. The above Seamless code can work fine.

+1  A: 

Anonymous types are just regular types that are implicitly declared. They have little to do with dynamic.

Now, if you were to use an ExpandoObject and reference it through a dynamic variable, you could add or remove fields on the fly.

edit

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

The above code and more can be found by clicking on that link.

Steven Sudit
But ExpandoObject can't to do it: `dynamic o1 = new ExpandObject(); o1."ID" = 1; o1."Name" = "Foo";`
Flash
But it also can't to do: Type o1Type = o1.GetType(); var props = o1Type.GetProperties(); props is empty
Flash
All you're doing is saying that dynamic properties are not identical to strongly-typed properties. This is trivially true.
Steven Sudit
A: 

You can use the anonymous delegate if you don't want to create a function with a name.

http://msdn.microsoft.com/en-us/library/0yw3tz5k%28VS.80%29.aspx

Or use the delegate as a place holder and replace it like a variable.

public delegate void MyFunctionDelegate();

void Myconcreatefun1() { }

MyFunctionDelegate d = MyConcreatefun1;

d();

Gopalakrishnan Subramani
As far as I understand the question, it does not relate to your answer. They seem to want as function that creates a type, not a way to create a delegate/function.
Steven Sudit