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

时间:2019-03-18 15:31:58

标签: c# wcf reflection inotifypropertychanged

我在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);
        }
    }
}

我有什么选择可以在没有反射的情况下动态更新服务端的属性?

2 个答案:

答案 0 :(得分: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";

答案 1 :(得分:0)

如果您只想应用UserInfo而不是任何类型,则可以使用if,否则,您只需在服务器端使用一种方法即可。

 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;
        }
    }