Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过字符串(反射?)从C#动态对象获取属性值_C#_Reflection_.net 4.0 - Fatal编程技术网

通过字符串(反射?)从C#动态对象获取属性值

通过字符串(反射?)从C#动态对象获取属性值,c#,reflection,.net-4.0,C#,Reflection,.net 4.0,假设我有一个动态变量: dynamic d = *something* 现在,我为d创建属性,另一方面,我从字符串数组中获得了这些属性: string[] strarray = { 'property1','property2',..... } 我事先不知道房子的名字 在代码中,一旦创建了d,并从数据库中提取了strarray,如何获取值 我想得到d.property1,d.property2 我看到该对象有一个\u字典内部字典,其中包含键和值,如何检索它们?我不知道是否有一种更优雅的方法来

假设我有一个动态变量:

dynamic d = *something*
现在,我为
d
创建属性,另一方面,我从字符串数组中获得了这些属性:

string[] strarray = { 'property1','property2',..... }
我事先不知道房子的名字

在代码中,一旦创建了
d
,并从数据库中提取了strarray,如何获取值

我想得到
d.property1,d.property2


我看到该对象有一个
\u字典
内部字典,其中包含键和值,如何检索它们?

我不知道是否有一种更优雅的方法来处理动态创建的对象,但使用普通的旧反射应该可以:

var nameOfProperty = "property1";
var propertyInfo = myObject.GetType().GetProperty(nameOfProperty);
var value = propertyInfo.GetValue(myObject, null);
如果
myObject
的类型不包含具有此名称的公共属性,则
GetProperty
将返回
null


编辑:如果对象不是“常规”对象,而是实现
IDynamicMetaObjectProvider
的对象,则此方法将不起作用。请看一下这个问题:


这将为您提供动态变量中定义的所有属性名称和值

dynamic d = { // your code };
object o = d;
string[] propertyNames = o.GetType().GetProperties().Select(p => p.Name).ToArray();
foreach (var prop in propertyNames)
{
    object propValue = o.GetType().GetProperty(prop).GetValue(o, null);
}
现在,
obj.\u Dictionary
包含一个字典。太好了

此代码必须与
+将代码中的_dictionary变量从“private readonly”改为public

希望这能帮助您:

public static object GetProperty(object o, string member)
{
    if(o == null) throw new ArgumentNullException("o");
    if(member == null) throw new ArgumentNullException("member");
    Type scope = o.GetType();
    IDynamicMetaObjectProvider provider = o as IDynamicMetaObjectProvider;
    if(provider != null)
    {
        ParameterExpression param = Expression.Parameter(typeof(object));
        DynamicMetaObject mobj = provider.GetMetaObject(param);
        GetMemberBinder binder = (GetMemberBinder)Microsoft.CSharp.RuntimeBinder.Binder.GetMember(0, member, scope, new CSharpArgumentInfo[]{CSharpArgumentInfo.Create(0, null)});
        DynamicMetaObject ret = mobj.BindGetMember(binder);
        BlockExpression final = Expression.Block(
            Expression.Label(CallSiteBinder.UpdateLabel),
            ret.Expression
        );
        LambdaExpression lambda = Expression.Lambda(final, param);
        Delegate del = lambda.Compile();
        return del.DynamicInvoke(o);
    }else{
        return o.GetType().GetProperty(member, BindingFlags.Public | BindingFlags.Instance).GetValue(o, null);
    }
}

你有没有看到ExpandooObject类

直接来自:“表示其成员可以在运行时动态添加和删除的对象。”

使用它,您可以编写如下代码:

dynamic employee = new ExpandoObject();
employee.Name = "John Smith";
((IDictionary<String, Object>)employee).Remove("Name");
d?.property1 , d?.property2
dynamic employee=new expandooobject();
employee.Name=“约翰·史密斯”;
((i词典)雇员)。删除(“姓名”);

认为这可能对将来的人有所帮助

如果您已经知道属性名称,可以执行以下操作:

[HttpPost]
[Route("myRoute")]
public object SomeApiControllerMethod([FromBody] dynamic args){
   var stringValue = args.MyPropertyName.ToString();
   //do something with the string value.  If this is an int, we can int.Parse it, or if it's a string, we can just use it directly.
   //some more code here....
   return stringValue;
}

如果d是由Newtonsoft创建的,则可以使用它读取属性名称和值:

    foreach (JProperty property in d)
    {
        DoSomething(property.Name, property.Value);
    }

使用以下代码获取动态对象属性的名称和值

dynamic d = new { Property1= "Value1", Property2= "Value2"};

var properties = d.GetType().GetProperties();
foreach (var property in properties)
{
    var PropertyName=property.Name; 
//You get "Property1" as a result

  var PropetyValue=d.GetType().GetProperty(property.Name).GetValue(d, null); 
//You get "Value1" as a result

// you can use the PropertyName and Value here
 }
您可以这样尝试:

dynamic employee = new ExpandoObject();
employee.Name = "John Smith";
((IDictionary<String, Object>)employee).Remove("Name");
d?.property1 , d?.property2
我已经对它进行了测试,并使用.netcore2.1

您可以使用“
dynamicObject.PropertyName.Value
”直接获取动态属性的值

示例

d.property11.Value

something
是否是
IDynamicMetaObjectProvider
?请检查调试器中
something
的运行时类型,并查看其公共成员。是否可以检查
d.GetType()
在运行时为您提供了什么?演示如何检索动态属性。此属性的可能副本对我来说非常有效,这是动态类型无法实现的,感谢它仅在d为静态类型时有效。如果D是一个IDynamicMetaObjectProvider(例如JObject),它将为您提供错误的属性。例如,如果d=obj,则不会返回“x”,而是返回JObject上的原始属性。JObject obj=JObject.FromObject(新的{x=123})@eWarton已经有一段时间了,但我看到它使用System.Linq.Expressions将动态getter绑定到调用站点,并将编译留给LambdaExpression。我不知道我是从反编译的代码中得到的,还是从其他地方得到的。你是个大师!属性名称未知。属性名称未知,因此无法使用。代码有效(我在visual studio中检查了它),因为employee实例是一个ExpandooObject,因此可以在运行时添加和删除属性(MS官方文档中对此进行了解释)。这段代码完成了这个问题。除了
ExpandoObject
,还有其他动态对象,比如
PSObject
。不@ADIMO它没有。问题是如何访问动态对象的属性。但目前他不知道这些属性是什么。它们来自一个字符串数组。因此,如果属性按名称存在,他需要找到该属性,如果基础类型是普通对象,则需要从属性中获取值。它不适用于像
PSObject
这样的包装器对象问题是从动态对象中获取值,但它的属性名为string。。。例如,他想做一些类似于我们在Javascript:obj[“property1”]中所做的事情,我相信这不是一个答案。问题是从动态对象获取值,但他将属性名称作为字符串。。。例如,他想做一些类似于我们在Javascript中所做的事情:obj[“property1”],我相信这不是一个答案。