首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >通过字符串获取c#动态属性的值

通过字符串获取c#动态属性的值
EN

Stack Overflow用户
提问于 2011-02-09 06:59:33
回答 11查看 283.1K关注 0票数 204

我想用一个字符串访问dynamic c#属性的值:

dynamic d = new { value1 = "some", value2 = "random", value3 = "value" };

如果我只有"value2“作为字符串,我如何获得d.value2 ("random")的值?在javascript中,我可以执行d"value2“来访问值(”value2“),但我不确定如何使用c#和反射来实现这一点。我最接近的例子是:

d.GetType().GetProperty("value2") ...但我不知道如何从中获得实际的值。

一如既往的感谢您的帮助!

EN

回答 11

Stack Overflow用户

回答已采纳

发布于 2011-02-09 07:01:34

有了PropertyInfo (来自GetProperty)之后,您需要调用GetValue并传入要从中获取值的实例。在您的案例中:

代码语言:javascript
复制
d.GetType().GetProperty("value2").GetValue(d, null);
票数 254
EN

Stack Overflow用户

发布于 2011-04-21 10:53:58

Dynamitey是一个开放源码的.net std库,让我们像使用dynamic关键字一样调用它,但是使用a字符串作为属性名称,而不是编译器为您做这件事,并且它最终是动态的(这远不如使用equal to reflection speedwise关键字快,但这是由于动态缓存的额外开销,其中编译器静态缓存)。

代码语言:javascript
复制
Dynamic.InvokeGet(d,"value2");
票数 28
EN

Stack Overflow用户

发布于 2015-08-31 09:30:00

为任何类型的属性同时获取settergetter的最简单方法是使用FastMember,这也是最快的方法(它使用Emit)。

您可以获取基于给定类型的TypeAccessor,也可以获取基于给定类型实例的ObjectAccessor

示例:

代码语言:javascript
复制
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");
票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4939508

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档