Как получить доступ к строковым свойствам объекта C# - PullRequest
0 голосов
/ 04 августа 2020

Я хотел бы получить доступ ко всем строковым свойствам объекта, который имеет определенные классы, которые также имеют свойства строкового типа, чтобы применить определенную обработку. Например:

public class Class1 
{ 
   public string String1 {get; set;}
   public Class2 class2 {get; set;}
}

public class Class2 
{ 
   public string String2 {get; set;}
}

Здесь я хотел бы иметь список свойств, содержащий String1 и String2

На данный момент я знаю, как получить доступ к String1:

var instanceOfClass1 =  new Class1();
var stringsList = instanceOfClass1.GetType().GetProperties().Where(prop => prop.PropertyType == typeof(string));

Но это не приведет к доступу к String2.

Заранее спасибо, если у вас есть идеи.

1 Ответ

2 голосов
/ 04 августа 2020

Вы можете использовать рекурсивный метод, который возвращает каждое свойство нужного типа

public static IEnumerable<PropertyInfo> GetProp<T>(object Obj)
{
    if (Obj is object)
    {
        foreach (var prop in Obj.GetType().GetProperties())
        {
            if (prop.PropertyType == typeof(T))
            {
                yield return prop;
            }
            else
            {
                foreach (var t in GetProp<T>(prop.GetValue(Obj)))
                    yield return t;
            }
        }
    }
}
public class Class1 
{ 
   public string String1 {get; set;}
   public Class2 class2 {get; set;}
}

public class Class2 
{ 
   public string String2 {get; set;}
    public Class3 class3 {get; set;}
}

public class Class3
{ 
   public string String3 {get; set;}
    public int int3 {get; set;}
}

var instanceOfClass1 =  new Class1
{
    class2 = new Class2
    {
        class3 = new Class3()
    }
};
        
foreach (var prop in GetProp<string>(instanceOfClass1))
{
    Console.WriteLine(prop);
}

Это выводит:

System.String String1
System.String String2
System.String String3

Обратите внимание, что круговая ссылка приведет к бесконечному циклу / переполнению стека:

public class Class1 
{ 
   public string String1 {get; set;}
   public Class2 class2 {get; set;}
    
    public Class1()
    {
        class2 = new Class2(this);
    }
}

public class Class2 
{ 
   public string String2 {get; set;}
    public Class1 class1 {get; set;}
    
    public Class2(Class1 class1)
    {
        this.class1 = class1;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...