我在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);
}
}
}
我有什么选择可以在没有反射的情况下动态更新服务端的属性?
答案 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;
}
}