我有一个用户详细信息课程
public partial class UserDetails
{
public int? Level { get; set; }
public string Unit { get; set; }
public string Bio { get; set; }
public bool? Gender { get; set; }
public int? Mobile { get; set; }
public string Photo { get; set; }
}
我正在编写一个更新方法:
public bool UpdateDetails(string userId, UserProperties updateProperty, string value)
{
switch(updateProperty)
{
case UserProperties.Unit:
details.Unit = value;
break;
case UserProperties.Photo:
details.Photo = value;
break;
default:
throw new Exception("Unknown User Detail property");
}
我可以在JavaScript中做类似动态属性的事情吗? 例如
var details = new UserDetails();
details["Unit"] = value;
更新
截至2019年!尝试使用此新功能怎么样? DynamicObject DynamicObject.TrySetMember(SetMemberBinder, Object) Method
我正试图弄清楚怎么写。
答案 0 :(得分:3)
您可以通过反射来实现对象上存在的属性。
C#具有一个称为Indexers的功能。您可以像这样扩展代码,以实现预期的行为。
public partial class UserDetails
{
public int? Level { get; set; }
public string Unit { get; set; }
public string Bio { get; set; }
public bool? Gender { get; set; }
public int? Mobile { get; set; }
public string Photo { get; set; }
// Define the indexer to allow client code to use [] notation.
public object this[string propertyName]
{
get {
PropertyInfo prop = this.GetType().GetProperty(propertyName);
return prop.GetValue(this);
}
set {
PropertyInfo prop = this.GetType().GetProperty(propertyName);
prop.SetValue(this, value);
}
}
}
除此之外,如果您在运行时不知道属性,则可以使用dynamic类型。
答案 1 :(得分:2)
如果您不想使用反射,则可以稍微调整Alens解决方案以使用字典来存储数据。
public class UserDetails
{
private Dictionary<string, object> Items { get; } = new Dictionary<string, object>();
public object this[string propertyName]
{
get => Items.TryGetValue(propertyName, out object obj) ? obj : null;
set => Items[propertyName] = value;
}
public int? Level
{
get => (int?)this["Level"];
set => this["Level"] = value;
}
}
答案 2 :(得分:0)
最接近的东西是ExpandoObject:
https://docs.microsoft.com/en-us/dotnet/api/system.dynamic.expandoobject?view=netframework-4.8
例如:
dynamic sampleObject = new ExpandoObject();
sampleObject.test = "Dynamic Property";
Console.WriteLine(sampleObject.test);