我想用一个字符串访问dynamic
c#属性的值:
dynamic d = new { value1 = "some", value2 = "random", value3 = "value" };
如果我只有"value2“作为字符串,我如何获得d.value2 ("random")的值?在javascript中,我可以执行d"value2“来访问值(”value2“),但我不确定如何使用c#和反射来实现这一点。我最接近的例子是:
d.GetType().GetProperty("value2")
...但我不知道如何从中获得实际的值。
一如既往的感谢您的帮助!
发布于 2011-02-09 07:01:34
有了PropertyInfo
(来自GetProperty
)之后,您需要调用GetValue
并传入要从中获取值的实例。在您的案例中:
d.GetType().GetProperty("value2").GetValue(d, null);
发布于 2011-04-21 10:53:58
Dynamitey是一个开放源码的.net std
库,让我们像使用dynamic
关键字一样调用它,但是使用a字符串作为属性名称,而不是编译器为您做这件事,并且它最终是动态的(这远不如使用equal to reflection speedwise关键字快,但这是由于动态缓存的额外开销,其中编译器静态缓存)。
Dynamic.InvokeGet(d,"value2");
发布于 2015-08-31 09:30:00
为任何类型的属性同时获取setter
和getter
的最简单方法是使用FastMember
,这也是最快的方法(它使用Emit)。
您可以获取基于给定类型的TypeAccessor
,也可以获取基于给定类型实例的ObjectAccessor
。
示例:
var staticData = new Test { Id = 1, Name = "France" };
var objAccessor = ObjectAccessor.Create(staticData);
objAccessor["Id"].Should().Be(1);
objAccessor["Name"].Should().Be("France");
var anonymous = new { Id = 2, Name = "Hilton" };
objAccessor = ObjectAccessor.Create(anonymous);
objAccessor["Id"].Should().Be(2);
objAccessor["Name"].Should().Be("Hilton");
dynamic expando = new ExpandoObject();
expando.Id = 3;
expando.Name = "Monica";
objAccessor = ObjectAccessor.Create(expando);
objAccessor["Id"].Should().Be(3);
objAccessor["Name"].Should().Be("Monica");
var typeAccessor = TypeAccessor.Create(staticData.GetType());
typeAccessor[staticData, "Id"].Should().Be(1);
typeAccessor[staticData, "Name"].Should().Be("France");
typeAccessor = TypeAccessor.Create(anonymous.GetType());
typeAccessor[anonymous, "Id"].Should().Be(2);
typeAccessor[anonymous, "Name"].Should().Be("Hilton");
typeAccessor = TypeAccessor.Create(expando.GetType());
((int)typeAccessor[expando, "Id"]).Should().Be(3);
((string)typeAccessor[expando, "Name"]).Should().Be("Monica");
https://stackoverflow.com/questions/4939508
复制相似问题