.net core C#在EF Core Database首先生成的模型类上使用动态属性名称

时间:2019-04-26 09:55:43

标签: c# .net-core entity-framework-core

我有一个用户详细信息课程

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

我正试图弄清楚怎么写。

3 个答案:

答案 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);