Saurabh Gupta1 Ответов: 3

Получить свойство из класса if class в строковой переменной, в C#


Привет ,
Моя проблема в том, что :

ВАР текст = "открытый класс Person { общественного строка имя { получить; набор; } общественная инт возраста { получить; набор; }общественного строка стране { получить; набор; } общественного строка EmailId { получить; набор; }общественная datetime JoinedOn { получить; набор; }}";


это мой класс в строковом формате. Мне нужно каждое свойство из класса. как сделать этот вопрос.

Я хочу получить результат в арррее или в какой-нибудь коллекции.

Заранее спасибо.

Что я уже пробовал:

I tried reflection but nothing happen.

3 Ответов

Рейтинг:
2

Chris Ross 2

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

Если это даже немного возможно, какой-то другой процесс (который включает в себя вас и вашу команду, проверяющую код перед его компиляцией) может быть более мудрым. И если человек проверяет код, то тот же самый человек может запустить компилятор, чтобы построить его и извлечь имена свойств.

Тем не менее, у вас есть два варианта программно извлекать имена свойств из исходного кода.

Один из них-скомпилировать код и использовать отражение для захвата имен свойств. Вот с чего стоит начать: https://support.microsoft.com/en-us/kb/304655[^]

Другой способ заключается в использовании регулярных выражений (посмотрите класс Regex) для анализа кода, поиска шаблона, который является свойством, и извлечения имени свойства. Этот вариант будет почти невозможен, если тела свойств являются чем-то сверх тривиальным.


Рейтинг:
2

#realJSOP

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

Я заметил, что ваш текст несколько искажен (отсутствуют некоторые пробелы), но этот код, похоже, справляется с этим нормально.

string text = "public class Person { public string Name { get; set; } public int Age { get; set; }public string Country { get; set; } public string EmailId { get; set; }public DateTime JoinedOn { get; set; }}";

string[] parts = text.Substring(text.IndexOf("{"))
                     .Replace("{ get; set; }", "")
                     .Trim()
                     .TrimStart('{')
                     .TrimEnd('}')
                     .Split(new string[] {" public "}, StringSplitOptions.RemoveEmptyEntries);

List<string> propertyNames = new List<string>();
foreach(string part in parts)
{
    string[] propertyParts = part.Trim().Split(new string[] {" "}, StringSplitOptions.RemoveEmptyEntries);
    if (propertyParts.Length != 2)
    {
        throw new Exception("Unexpected property configuration");
    }
    propertyNames.Add(propertyParts[1]);
}


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


Рейтинг:
1

OriginalGriff

Текстовая строка не является классом - чтобы ее можно было рассматривать как класс и получить к ней доступ с помощью отражения, ее нужно было бы скомпилировать. И пока это возможно ... csc.exe предоставляется .NET и может быть вызван из вашего приложения - я не могу не думать, что вы пытаетесь сделать это совершенно неправильно.

Зачем вам нужно определение класса на основе строк и пытаться извлечь из него свойства? В "реальном мире"это не имеет большого смысла...