c# - List<dynamic> elements have fields but I cannot access them. Why? -


i need loop on list<dynamic> objects.

the list's objects have values, reason, not able access of dynamic object fields. below screenshot of debug window:

enter image description here

there can see object contains fields (such alias, id, name, etc).

i tried both casting idictionary<string, object> , expandoobject, no avail. did not face such thing before: failing access existing fields in dynamic object when exist.

what wrong here?

the code throwing microsoft.csharp.runtimebinder.runtimebinderexception message stating {"'object' not contain definition 'name'"}.

the list created adding anonymously-typed objects, this:

return new list<dynamic>(fields.select(field => new                          {                              id = field.id,                              alias = field.alias,                              name = field.name,                              type = field.type,                              value = field.value,                             sortorder = field.sortorder                         })); 

where fields icollection<field>, strongly-typed collection.

the telling part exception:

{"'object' not contain definition 'name'"}.

this indicates runtime binder not capable of accessing type you're passing in dynamic (since dynamic enforce visibility rules).

the cause of you're creating anonymous type in different assembly 1 you're subsequently reading - since anonymous types declared internal, consuming assembly cannot access it, causing error message above.

contrast usual case of runtime binder exceptions:

'<>f__anonymoustype0< string >' not contain definition 'name'

edit:

a possible solution problem use internalsvisibletoattribute on assembly containing anonymous type. however, code smell - other use of internalsvisibletoattribute or internal itself.

a better way make sure don't pass anonymous types on assembly boundaries - after all, shouldn't used outside of method originated from; fact implementation detail of .net - didn't have way same thing. could change in future versions, making internalsvisibletoattribute solution doubly unreliable.

the way code using dynamic suggests team has flawed assumptions how dynamic works , how it's supposed used. note how actual runtime type of list<dynamic> list<object>. same goes arguments of type dynamic (which again object, albeit marked dynamicattribute). , in fact, dynamic - it's way handle runtime dynamic dispatch - it's not property of type or anything, it's way invoke whatever you're trying invoke. c#, dynamic allows skip of compiler checks when working dynamic types, , generates code handle dispatch automatically, of happens inside method use dynamic keyword - if used list<object>, end result same.

in code, there's no reason not use simple static types. dynamic typing doesn't give benefits, apart effort code types themselves. if co-workers don't that, well, should present better solution - problem quite obvious, , it's need deal with.

much worse, explicitly hides context, all type information. that's not want in api, internal or not! if want hide concrete types being used, why not - should still expose interface instead. suspect reason why anonymous types can't implement interfaces - encourage go entirely wrong way.


Comments

Popular posts from this blog

android - MPAndroidChart - How to add Annotations or images to the chart -

javascript - Add class to another page attribute using URL id - Jquery -

firefox - Where is 'webgl.osmesalib' parameter? -