如何在更新客户端属性时更新服务器属性

问题描述 投票:0回答:2

我在WCF通信的两侧有两个相同的类:

public class UserInfo
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public int Age { get; set; }
    ....
}

一个客户端的类更新我需要更新服务的类。我可以用方法实现WCF服务:

public interface IUserInfoUpdateContract
{
   void UpdateFirstName(string value);
   void UpdateLastName(string value);
   void UpdateAge(string value);
   ...
}

但是,有没有其他方法可以动态更新属性?例如。:

public interface IUserInfoUpdate
{
   void UpdateProperty(string propertyName, object propertyValue);
}

客户端用法:

public class UserInfo
{
    private string _firstName;
    public string FirstName 
    { 
        get { return _firstName; }
        set 
        { 
            _firstName = value;
            wcfClient.UpdateProperty(nameof(FirstName), FirstName);
        }
    }
}

我有没有选择如何在没有Reflection的情况下动态更新服务端的属性?

c# wcf reflection inotifypropertychanged
2个回答
0
投票

由于您不想使用反射,因此可以执行以下操作。将内部Dictionary添加到UserInfo包含所有属性值,然后可以通过属性名称string引用这些值

public class UserInfo
{
    private IDictionary<string, object> _dictionary = new Dictionary<string, object>();

    public string FirstName
    {
        get
        {
            object value;
            return _dictionary.TryGetValue(nameof(FirstName), out value) ? (string)value : null;
        }
        set
        {
            _dictionary[nameof(FirstName)] = value;
        }
    }


    public string LastName
    {
        get
        {
            object value;
            return _dictionary.TryGetValue(nameof(LastName), out value) ? (string)value : null;
        }
        set
        {
            _dictionary[nameof(LastName)] = value;
        }
    }

    public int Age
    {
        get
        {
            object value;
            return _dictionary.TryGetValue(nameof(Age), out value) ? (int)value : 0;
        }
        set
        {
            _dictionary[nameof(Age)] = value;
        }
    }

    public object this[string property]
    {
        set
        {
            //todo: validation if needed
            _dictionary[property] = value;
        }
    }

用法

var info = new UserInfo();
info.FirstName = "hello";
info["LastName"] = "Last";

0
投票

如果您只想申请UserInfo而不是任何类型,您可以使用if else,这样您只需要服务器端的一个方法。

 public void UpdateProperty(string propertyName,object propertyValue)
    {
        UserInfo userInfo = new UserInfo(); // use your userInfo
        if(propertyName == "FirstName")
        {
            userInfo.FirstName = propertyValue as string;
        }
        if(propertyName == "Age")
        {
            userInfo.Age = (int)propertyValue;
        }
    }
© www.soinside.com 2019 - 2024. All rights reserved.