Code below is working well as long as I have class ClassSameAssembly in same assembly as class Program.
But when I move class ClassSameAssembly to a separate assembly, a RuntimeBinderException (see below) is thrown.
Is it possible to resolve it?
using System;
namespace ConsoleApplication2
{
public static class ClassSameAssembly
{
public static dynamic GetValues()
{
return new
{
Name = "Michael", Age = 20
};
}
}
internal class Program
{
private static void Main(string[] args)
{
var d = ClassSameAssembly.GetValues();
Console.WriteLine("{0} is {1} years old", d.Name, d.Age);
}
}
}
Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: ‘object’ does not contain a definition for ‘Name’
at CallSite.Target(Closure , CallSite , Object )
at System.Dynamic.UpdateDelegates.UpdateAndExecute1[T0,TRet](CallSite site, T0 arg0)
at ConsoleApplication2.Program.Main(String[] args) in C:\temp\Projects\ConsoleApplication2\ConsoleApplication2\Program.cs:line 23
I believe the problem is that the anonymous type is generated as
internal, so the binder doesn’t really “know” about it as such.Try using ExpandoObject instead:
I know that’s somewhat ugly, but it’s the best I can think of at the moment… I don’t think you can even use an object initializer with it, because while it’s strongly typed as
ExpandoObjectthe compiler won’t know what to do with “Name” and “Age”. You may be able to do this:but that’s not much better…
You could potentially write an extension method to convert an anonymous type to an expando with the same contents via reflection. Then you could write:
That’s pretty horrible though 🙁