Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.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#DynamicObject类动态属性_C#_Dynamicobject - Fatal编程技术网

循环中的c#DynamicObject类动态属性

循环中的c#DynamicObject类动态属性,c#,dynamicobject,C#,Dynamicobject,所以我创建了一个继承DynamicObject的类 public class MyDynamicObject : DynamicObject{ private Dictionary<string, object> Fields = new Dictionary<string, object>(); public override bool TryGetMember(GetMemberBinder binder, out object result) { retu

所以我创建了一个继承DynamicObject的类

public class MyDynamicObject : DynamicObject{
private Dictionary<string, object> Fields = new Dictionary<string, object>();

public override bool TryGetMember(GetMemberBinder binder, out object result)
{
    return Fields.TryGetValue(binder.Name, out result);
}

public override bool TrySetMember(SetMemberBinder binder, object value)
{
    Fields[binder.Name] = value;
    return true;
}
}
这当然会奏效。但是我需要从字符串数组创建属性,比如

string[] fields = new string[]{"taxid","newcol","addrs","gender"};
dynamic person = new MyDynamicObject();
foreach(var f in fields)
{
  person.f = "hello";
}
因此,输出将是person.taxi、person.newcol、person.addrs、person.gender


这是可能的吗?

以某种方式公开
字段
字典,或者(更好的)一种允许按名称显式设置属性的方法

请注意,
ExpandoObject
已经这样做了,因为它可以强制转换为
IDictionary
,然后

ExpandoObject eo = new ExpandoObject();
IDictionary<string, object> dict = eo;
dynamic d = eo;
dict["MyProperty"] = 42;
Console.WriteLine(d.MyProperty); // 42
ExpandoObject eo=新的ExpandoObject();
词典dict=eo;
动态d=eo;
dict[“MyProperty”]=42;
Console.WriteLine(d.MyProperty);//42

如果你不能只用
ExpandoObject
本身,你可以复制它的方法。

好吧,根据@Jon Hanna的建议,我想出了一个符合我要求的解决方案。我创建了一个新的Add方法,它接受一个名称。下面是我使用的更新代码

public class DynamicFormData : DynamicObject
{
    private Dictionary<string, object> Fields = new Dictionary<string, object>();

    public int Count { get { return Fields.Keys.Count; } }

    public void Add(string name, string val = null)
    {
        if (!Fields.ContainsKey(name))
        {
            Fields.Add(name, val);
        }
        else
        {
            Fields[name] = val;
        }
    }

    public override bool TryGetMember(GetMemberBinder binder, out object result)
    {
        if (Fields.ContainsKey(binder.Name))
        {
            result = Fields[binder.Name];
            return true;
        }
        return base.TryGetMember(binder, out result); 
    }

    public override bool TrySetMember(SetMemberBinder binder, object value)
    {
        if (!Fields.ContainsKey(binder.Name))
        {
            Fields.Add(binder.Name, value);
        }
        else
        {
            Fields[binder.Name] = value;
        }
        return true;
    }

    public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)
    {
        if (Fields.ContainsKey(binder.Name) &&
            Fields[binder.Name] is Delegate)
        {
            Delegate del = Fields[binder.Name] as Delegate;
            result = del.DynamicInvoke(args);
            return true;
        }
        return base.TryInvokeMember(binder, args, out result);
    }
}

看看内置的ExpandoObject;基本上,你必须公开一个向字典中添加字段的方法。我想你的问题可能会在第一个评论者说的时候得到回答,为什么不让字典这样做呢?person[f]=“hello”我已经使用ExpandoObject及其工作方式完成了,但我的要求是创建一个具有动态属性并可以实例化的类,我不知道这是否可能
public class DynamicFormData : DynamicObject
{
    private Dictionary<string, object> Fields = new Dictionary<string, object>();

    public int Count { get { return Fields.Keys.Count; } }

    public void Add(string name, string val = null)
    {
        if (!Fields.ContainsKey(name))
        {
            Fields.Add(name, val);
        }
        else
        {
            Fields[name] = val;
        }
    }

    public override bool TryGetMember(GetMemberBinder binder, out object result)
    {
        if (Fields.ContainsKey(binder.Name))
        {
            result = Fields[binder.Name];
            return true;
        }
        return base.TryGetMember(binder, out result); 
    }

    public override bool TrySetMember(SetMemberBinder binder, object value)
    {
        if (!Fields.ContainsKey(binder.Name))
        {
            Fields.Add(binder.Name, value);
        }
        else
        {
            Fields[binder.Name] = value;
        }
        return true;
    }

    public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)
    {
        if (Fields.ContainsKey(binder.Name) &&
            Fields[binder.Name] is Delegate)
        {
            Delegate del = Fields[binder.Name] as Delegate;
            result = del.DynamicInvoke(args);
            return true;
        }
        return base.TryInvokeMember(binder, args, out result);
    }
}
string[] fields = new string[]{"taxid","newcol","addrs","gender"};
dynamic formData = new DynamicFormData();

foreach(string field in fields)
{
    formData.Add(field, null);
}