Получить имена свойств из метода класса - PullRequest
0 голосов
/ 28 июня 2019

Есть ли способ получить имена свойств внутри метода GetPKs?может быть, используя отражение?

, поэтому в приведенном ниже примере мне нужно как-то получить объект [], который возвращает «Id», «Id2».Id3 будет игнорироваться.Мне не нужны значения, но имена Id

public class MyClass
{ 
     public int Id; 
     public int Id2;
     public int Id3;
     public object[] GetPKs() => new object[] { Id, Id2 };
 }

Ответы [ 2 ]

0 голосов
/ 28 июня 2019

Проблема в том, что ваши Id, Id2 и Id3 являются просто целочисленными значениями, поэтому, если Id2==Id3, вы не знаете, что вам нужно распечатать, Id2 или Id3 Еслимы предполагаем , что все ваши свойства различны, вы можете пойти по этому пути:

public class MyClass
{ 
     public int Id; 
     public int Id2;
     public int Id3;
     public object[] GetPKs() => new object[] { Id, Id2 };
     public IEnumerable<string> GetPNames() 
     {
        var allProperties = GetType().GetProperties().Select(x=>new {x.Name, Value = x.GetValue(this)});
        var allFields = GetType().GetFields().Select(x=>new {x.Name, Value = x.GetValue(this)});
        var dict = allProperties.Concat(allFields).ToDictionary(x=>x.Value, x=>x.Name);
        foreach(var value in GetPKs())
        {
            yield return dict[value];
        }
     }
}

Этот код перебирает поля и свойства.Если у вас есть только поля, вы можете упростить это:

public class MyClass
{ 
     public int Id; 
     public int Id2;
     public int Id3;
     public object[] GetPKs() => new object[] { Id, Id2 };
     public IEnumerable<string> GetPNames() 
     {          
        var allFields = GetType().GetFields()
                                 .Select(x=>new {x.Name, Value = x.GetValue(this)});
        var dict = allFields.ToDictionary(x=>x.Value, x=>x.Name);
        foreach(var value in GetPKs())
        {
            yield return dict[value];
        }
     }
}

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

public class MyClass
{ 
     public int Id; 
     public int Id2;
     public int Id3;
     public Expression<Func<MyClass,object>>[] GetPKs() 
                       => new Expression<Func<MyClass,object>>[] { x=>Id, x=>Id2 };
     public IEnumerable<string> GetPNames()
     {
        return GetPKs().Select(expr =>
              ((MemberExpression)((UnaryExpression)expr.Body).Operand).Member.Name);
     }
}
0 голосов
/ 28 июня 2019

Прежде всего, Id и Id2 не являются свойствами. Они являются экземплярами объекта в массиве object []. Если Id и Id2 объявлены в MyClass, вы можете получить доступ к именам их свойств с помощью отражения.


    public class MyClass
    {
        public int Id { get; set; }
        public int Id2 { get; set; }
        public object[] GetPKs() => new object[] { Id, Id2 };
    }

    class Program
    {
        static void Main(string[] args)
        {
            MyClass myClass = new MyClass();

            foreach (var item in myClass.GetType().GetProperties())
            {
                Console.WriteLine(item.Name);
            }

            Console.Read();
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...