簡體   English   中英

C#如何通過Func Delegate設置參數值

[英]C# how to set parameter value by Func Delegate

我需要一種干凈的方法來使用同一類的參數更新對象。 我將字段列表定義為Func<T, object>委托。 如果需要,這些是應該進行比較和更新的列表。 不幸的是,我想不出一個干凈的方法來實現它。

以下代碼不起作用:

public class UpdatableClass
{
    public int Id { get; set; }
    public int IntValue { get; set; }
    public string StringValue { get; set; }
    public DateTime ModifiedDate { get; set; }


    private List<Func<UpdatableClass, object>> UpdatableFields =
        new List<Func<UpdatableClass, object>>()
        {
            c => c.IntValue,
            c => c.StringValue
        };

    public bool Update(UpdatableClass newValues)
    {
        bool isUpdated = false;
        foreach (var fieldSelector in UpdatableFields)
        {
            object oldValue = fieldSelector(this);
            object newValue = fieldSelector(newValues);
            if (!newValue.Equals(oldValue))
            {
                oldValue = newValue;
                isUpdated = true;
            }
        }

        return isUpdated;
    }
}

[TestFixture]
public class UpdatableClassTests
{
    [Test]
    public void TestUpdateMethod()
    {
        UpdatableClass oldObject = new UpdatableClass()
        {
            StringValue = "OldString",
            IntValue = 3,
        };

        bool isUpdated = oldObject.Update(new UpdatableClass() { StringValue = "NewString", IntValue = 4 });

        Assert.IsTrue(isUpdated);
        Assert.AreEqual("NewString", oldObject.StringValue);
        Assert.AreEqual(4, oldObject.IntValue);
    }
}

此代碼可用作該問題的可能解決方案。 您可以為 getter 和 setter (Func<UpdatableClass, object> Get, Action<UpdatableClass, object> Set)使用元組,而不是只獲取Func<T, object> 我不認為這是最好的解決方案,但它解決了問題並使測試通過

public class UpdatableClass
{
    public int Id { get; set; }
    public int IntValue { get; set; }
    public string StringValue { get; set; }
    public DateTime ModifiedDate { get; set; }

    private List<(Func<UpdatableClass, object> Get, Action<UpdatableClass, object> Set)> UpdatableFields =
        new List<(Func<UpdatableClass, object>, Action<UpdatableClass, object>)>
        {
            (c => c.IntValue, (c, v) => { c.IntValue = Convert.ToInt32(v); }),
            (c => c.StringValue, (c, v) => { c.StringValue = v.ToString(); })
        };

    public bool Update(UpdatableClass newValues)
    {
        bool isUpdated = false;
        foreach (var field in UpdatableFields)
        {
            object oldValue = field.Get(this);
            object newValue = field.Get(newValues);
            if (!newValue.Equals(oldValue))
            {
                field.Set(this, newValue);
                isUpdated = true;
            }
        }

        return isUpdated;
    }
}   

暫無
暫無

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

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