Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.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#_Dynamic_Reflection_Properties - Fatal编程技术网

在运行时动态添加C#属性

在运行时动态添加C#属性,c#,dynamic,reflection,properties,C#,Dynamic,Reflection,Properties,我知道有一些问题可以解决这个问题,但答案通常是推荐字典或参数集合,这在我的情况下不起作用 我正在使用一个通过反射工作的库来处理具有属性的对象。这适用于已定义的类以及动态类。我需要更进一步,按照以下思路做一些事情: public static object GetDynamicObject(Dictionary<string,object> properties) { var myObject = new object(); foreach (var property

我知道有一些问题可以解决这个问题,但答案通常是推荐字典或参数集合,这在我的情况下不起作用

我正在使用一个通过反射工作的库来处理具有属性的对象。这适用于已定义的类以及动态类。我需要更进一步,按照以下思路做一些事情:

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;

}
公共静态对象GetDynamicObject(字典属性){
var myObject=新对象();
foreach(属性中的var属性){
//下一行显然不起作用。。。
myObject.AddProperty(property.Key,property.Value);
}
返回myObject;
}
公共图书馆{
var properties=newdictionary();
添加(“Property1”,aCustomClassInstance);
添加(“Property2”、“TestString2”);
var myObject=GetDynamicObject(属性);
//然后像这样使用它们(或者说插件通过反射使用它们)
var customClass=myObject.Property1;
var myString=myObject.Property2;
}

该库可以很好地处理动态变量类型,并手动指定属性。但是,我不知道之前会添加多少或哪些属性。

您看过ExpandoObject吗

见:

从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;
        }
    }
}
公共静态动态GetDynamicObject(字典属性) { 返回新的MyDynObject(属性); } 公共密封类MyDynObject:DynamicObject { 私有只读字典_属性; 公共MyDynObject(字典属性) { _属性=属性; } 公共重写IEnumerable GetDynamicMemberNames() { 返回_properties.Keys; } 公共重写bool TryGetMember(GetMemberBinder绑定器,输出对象结果) { if(_properties.ContainsKey(binder.Name)) { 结果=_属性[binder.Name]; 返回true; } 其他的 { 结果=空; 返回false; } } public override bool TrySetMember(SetMemberBinder绑定器,对象值) { if(_properties.ContainsKey(binder.Name)) { _属性[binder.Name]=值; 返回true; } 其他的 { 返回false; } } } 这样,您只需要:

var dyn = GetDynamicObject(new Dictionary<string, object>()
    {
        {"prop1", 12},
    });

Console.WriteLine(dyn.prop1);
dyn.prop1 = 150;
var dyn=GetDynamicObject(新字典()
{
{“prop1”,12},
});
控制台写入线(dyn.prop1);
dyn.prop1=150;

从DynamicObject派生允许您提出自己的策略来处理这些动态成员请求,注意这里有怪物:编译器将无法验证许多动态调用,您将无法获得intellisense,所以请记住这一点。

谢谢@Clint给出的好答案:

只是想强调使用Expando对象解决此问题是多么容易:

var dynamicObject = new ExpandoObject() as IDictionary<string, Object>;
foreach (var property in properties) {
    dynamicObject.Add(property.Key,property.Value);
}      
var dynamicObject=newexpandoobject()作为IDictionary;
foreach(属性中的var属性){
添加(property.Key、property.Value);
}      

您可以将json字符串反序列化到字典中,然后添加新属性,然后将其序列化

var jsonString = @"{}";

var jsonDoc = JsonSerializer.Deserialize<Dictionary<string, object>>(jsonString);

jsonDoc.Add("Name", "Khurshid Ali");

Console.WriteLine(JsonSerializer.Serialize(jsonDoc));
var jsonString=@“{}”;
var jsonDoc=JsonSerializer.Deserialize(jsonString);
jsonDoc.Add(“名称”、“Khurshid Ali”);
WriteLine(JsonSerializer.Serialize(jsonDoc));
这里的属性是什么“foreach(属性中的var属性)”,例如,我有一个学生类,我想根据我的JSON响应添加属性