簡體   English   中英

循環中的c#DynamicObject類動態屬性

[英]c# DynamicObject class dynamic properties from loop

所以我創建了一個繼承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;
}
}

並在這里叫這個班

public class Program
{
public static void Main()
{
    dynamic person = new MyDynamicObject();
    person.firstname = "Hello";
    Console.WriteLine(person.firstname);
 }
}  

當然可以。 但是我需要從像這樣的字符串數組創建屬性

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

這可能嗎?

以某種方式或更好的方法公開Fields字典,該方法允許人們按名稱顯式設置屬性。

請注意, ExpandoObject已經執行了此操作,因為可以將其IDictionary<string, object>IDictionary<string, object> ,然后您可以

ExpandoObject eo = new ExpandoObject();
IDictionary<string, object> dict = eo;
dynamic 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);
    }
}

然后我就這樣稱呼它。

string[] fields = new string[]{"taxid","newcol","addrs","gender"};
dynamic formData = new DynamicFormData();

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM