Pau*_*haw 81 c# reflection properties dynamic
我知道有一些问题可以解决这个问题,但答案通常遵循推荐字典或参数集合的方式,这在我的情况下不起作用.
我正在使用一个通过反射工作的库,用具有属性的对象做很多聪明的事情.这适用于已定义的类以及动态类.我需要更进一步,按照这些方针做一些事情:
public static object GetDynamicObject(Dictionary<string,object> properties) {
    var myObject = new object();
    foreach (var property in properties) {
        //This next line obviously doesn't work... 
        myObject.AddProperty(property.Key,property.Value);
    }
    return myObject;
}
public void Main() {
    var properties = new Dictionary<string,object>();
    properties.Add("Property1",aCustomClassInstance);
    properties.Add("Property2","TestString2");
    var myObject = GetDynamicObject(properties);
    //Then use them like this (or rather the plug in uses them through reflection)
    var customClass = myObject.Property1;
    var myString = myObject.Property2;
}
该库适用于动态变量类型,手动分配属性.但是我不知道预先添加了多少或哪些属性.
Cli*_*int 95
你看过ExpandoObject了吗?
请参阅:http://blogs.msdn.com/b/csharpfaq/archive/2009/10/01/dynamic-in-c-4-0-introducing-the-expandoobject.aspx
来自MSDN:
ExpandoObject类使您可以在运行时添加和删除其实例的成员,还可以设置和获取这些成员的值.此类支持动态绑定,使您可以使用标准语法(如sampleObject.sampleMember)而不是像sampleObject.GetAttribute("sampleMember")这样的更复杂的语法.
允许你做一些很酷的事情:
dynamic dynObject = new ExpandoObject();
dynObject.SomeDynamicProperty = "Hello!";
dynObject.SomeDynamicAction = (msg) =>
    {
        Console.WriteLine(msg);
    };
dynObject.SomeDynamicAction(dynObject.SomeDynamicProperty);
根据您的实际代码,您可能更感兴趣:
public static dynamic GetDynamicObject(Dictionary<string, object> properties)
{
    return new MyDynObject(properties);
}
public sealed class MyDynObject : DynamicObject
{
    private readonly Dictionary<string, object> _properties;
    public MyDynObject(Dictionary<string, object> properties)
    {
        _properties = properties;
    }
    public override IEnumerable<string> GetDynamicMemberNames()
    {
        return _properties.Keys;
    }
    public override bool TryGetMember(GetMemberBinder binder, out object result)
    {
        if (_properties.ContainsKey(binder.Name))
        {
            result = _properties[binder.Name];
            return true;
        }
        else
        {
            result = null;
            return false;
        }
    }
    public override bool TrySetMember(SetMemberBinder binder, object value)
    {
        if (_properties.ContainsKey(binder.Name))
        {
            _properties[binder.Name] = value;
            return true;
        }
        else
        {
            return false;
        }
    }
}
那样你只需要:
var dyn = GetDynamicObject(new Dictionary<string, object>()
    {
        {"prop1", 12},
    });
Console.WriteLine(dyn.prop1);
dyn.prop1 = 150;
从DynamicObject派生允许您提出自己的策略来处理这些动态成员请求,请注意这里有怪物:编译器将无法验证您的大量动态调用而您将无法获得智能感知,所以请保持记住了.
Pau*_*haw 33
谢谢@Clint的好答案:
只是想强调使用Expando对象解决这个问题是多么容易:
    var dynamicObject = new ExpandoObject() as IDictionary<string, Object>;
    foreach (var property in properties) {
        dynamicObject.Add(property.Key,property.Value);
    }
小智 6
您可以将 json 字符串反序列化为字典,然后添加新属性然后将其序列化。
var jsonString = @"{}";
var jsonDoc = JsonSerializer.Deserialize<Dictionary<string, object>>(jsonString);
jsonDoc.Add("Name", "Khurshid Ali");
Console.WriteLine(JsonSerializer.Serialize(jsonDoc));
| 归档时间: | 
 | 
| 查看次数: | 148942 次 | 
| 最近记录: |