Как инициализировать свойство, установив какое-либо значение, не передавая ничего через конструктор - PullRequest
0 голосов
/ 02 августа 2020

У меня есть дополнительная работа, чтобы получить значение из строки и установить свойство Как показано в примере.

Здесь я помещаю все c logi для извлечения значения из строки в конструкторе , и я установил все свойство.

public class CourseModuleView
{

    public CourseModuleView(string str)
    {
        var re = new Regex(@"'(.*?)'");
        var results = Regex.Matches(str, @"'(.*?)'", RegexOptions.Singleline)
                .Cast<Match>()
                .Select(x => x.Groups[1].Value);

        UserId = int.Parse(results.ElementAt(0));
        ComponentType = results.ElementAt(1);
        ModuleId = int.Parse(results.ElementAt(2));
    }
    public int Id { get; set; }
    public int UserId { get; set; }
    public int ModuleId { get; set; }
    public string ComponentType { get; set; }
}

Я вызываю свой конструктор как:

//str will have the pattern like this, 
//"The user with id '2209' viewed the 'url' activity with course module id '317'
// but it will be a list of string
var modCompletedResult = allLog
     .Where(x => x.EventName == EventNameMessage.CourseModuleView)
     .Select(x => new CourseModuleView(x.str)
     {
        //other property setting code goes here

     }).ToList();

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

Какой другой наиболее подходящий способ set the property при извлечении значения из string без записи всех logi c в конструкторе?

1 Ответ

1 голос
/ 02 августа 2020
public int Id { get; set { this.Id = extractId(value); }}
public int UserId { get; set { this.UserId = extractUserId(value); }}
.....

Затем назначьте его в выборе:

var theString = "The user with id '2209' viewed the 'url' activity with course module id '317'.";
var modCompletedResult = allLog
 .Where(x => x.EventName == EventNameMessage.CourseModuleView)
 .Select(x => new CourseModuleView()
 {
    Id = theString,
    UserId = theString,
    ......
 }).ToList();

Извините, я использую телефон, довольно сложно написать здесь код.

Параметры C# setter и getter очень эффективны, вы даже можете установить другие свойства при назначении только одного свойства. Пример

public int Id { get; 
    set {   
         var extracted = extractAll(value); 
         this.Id = extracted.Id;
         this.UserId = extracted.UserId;
         .......
     } 
}

.Select(x => new CourseModuleView()
 {
    Id = theString, //assign only Id will automatically assign all properties according to the Id setter logic
 }).ToList();

Кстати, вы должны сохранить имя value в сеттере, если нет, он попытается найти указанную переменную внутри локальной области.

Извините за ошибку, когда вы назначаете свойство в select, оно должно быть того же типа, Id должно быть присвоено int.

В вашем случае вы можете создать фиктивное свойство типа string затем примените в нем сеттер logi c.

Пример:

public string dummy { get; set { ..... }}

Надеюсь, это сработает для вас.

public void SetEverything(string str)
{
    var re = new Regex(@"'(.*?)'");
    var results = Regex.Matches(str, @"'(.*?)'", RegexOptions.Singleline)
            .Cast<Match>()
            .Select(x => x.Groups[1].Value);

    this.UserId = int.Parse(results.ElementAt(0));
    this.ComponentType = results.ElementAt(1);
    this.ModuleId = int.Parse(results.ElementAt(2));
}
public int Id { get; set; }
public int UserId { get; set; }
public int ModuleId { get; set; }
public string ComponentType { get; set; }

public string Setter { get { return ""; } //return empty string 
    set {
        SetEverything(value);
    }
}

Тогда

var modCompletedResult = allLog
 .Where(x => x.EventName == EventNameMessage.CourseModuleView)
 .Select(x => new CourseModuleView()
 {
    Setter = x.str,
 }).ToList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...