我在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的情况下动态更新服务端的属性?
由于您不想使用反射,因此可以执行以下操作。将内部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";
如果您只想申请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;
}
}