.net core C # использует динамическое имя свойства в первом сгенерированном классе модели EF Core Database - PullRequest
1 голос
/ 26 апреля 2019

У меня есть класс данных пользователя

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) Метод

Я пытаюсь выяснить, как его написать.

Ответы [ 3 ]

3 голосов
/ 26 апреля 2019

Вы можете сделать это с помощью отражения для свойств, существующих в объекте.

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 тип.

2 голосов
/ 26 апреля 2019

Если вы не хотите использовать отражение, вы можете слегка настроить решение 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;
    }
}
0 голосов
/ 26 апреля 2019

Ближайшим объектом будет объект 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);
...