Получить имя метода, вызываемого из списка классов, в виде строки - PullRequest
0 голосов
/ 30 октября 2019

У меня есть список методов, которые я вызываю в списке:

List<ReportResult> results = new List<ReportResult>() {
    await GetInvalid("ASC", offset, limit),
    await GetActive("ASC", offset, limit),
    await GetValid("ASC", offset, limit)
};

При переборе каждого элемента в списке я хотел бы установить строку, равную имени метода, который былназывается. Например:

DataTable outTable = new DataTable();

foreach (ReportResult report in results)
{
    DataRow dr = outTable.NewRow();
    string methodName = "GetInvalid";
    dr[0] = methodName;
    outTable.Rows.Add(dr);
}

Ответы [ 5 ]

2 голосов
/ 30 октября 2019

Внутри всех трех методов вы можете вызвать метод GetName и добавить новое поле в ReportResult.

GetName будет выглядеть примерно так:

public static string GetName([CallerMemberName]string memberName = "") 
   => memberName; 

Test

Код

class ReportResult { 
//(...)
public string Mama {get;set;} // Aka Source
}

public static string GetCaller([CallerMemberName]string memberName = "") => memberName; 

public async static Task Main()
{
    var offset = 1;
    var limit = 10;
        List<ReportResult> results = new List<ReportResult>() {
        await GetInvalid("ASC", offset, limit),
        await GetActive("ASC", offset, limit),
        await GetValid("ASC", offset, limit)
    };

    foreach(var r in results ) Console.WriteLine(r.Mama);
}

private static Task<ReportResult> GetValid(string v, object offset, object limit) {
    return Task.FromResult(new ReportResult{  Mama = GetCaller() });
}

private static Task<ReportResult> GetActive(string v, object offset, object limit) {
    return Task.FromResult(new ReportResult{ Mama = GetCaller() });
}

private static Task<ReportResult> GetInvalid(string v, object offset, object limit) {
    return Task.FromResult(new ReportResult{ Mama = GetCaller() });
}

Выход

GetInvalid
GetActive
GetValid
2 голосов
/ 30 октября 2019

По моему мнению, самым простым решением будет просто сделать что-то подобное:

List<KeyValuePair<string,ReportResult>> results = new List<KeyValuePair<string,ReportResult>> () {
 new KeyValuePair<string, ReportResult>("GetInvalid",  await GetInvalid("ASC", offset, limit)),
 new KeyValuePair<string, ReportResult>("GetActive",  await GetActive("ASC", offset, limit)),
 new KeyValuePair<string, ReportResult>("GetValid",  await GetValid("ASC", offset, limit))       
    };

более чистым решением будет просто использовать Dictonary вместо списка KeyValuePair, но таким образом вы можете иметьодин и тот же ключ более одного раза.

0 голосов
/ 30 октября 2019

Когда вы используете

 await GetInvalid("ASC", offset, limit)

, вы работаете со значениями, а не с методами. .NET предоставляет System.Reflection для работы с методами и System.Threading.Tasks.Task для работы с функциями. Если вас интересуют имена методов, лучше использовать первый вариант.

var thisType = this.GetType();
var resultsMethods = new List<MethodInfo>() {
    thisType.GetMethod("GetInvalid"),
    thisType.GetMethod("GetActive"),
    thisType.GetMethod("GetValid")
};

И, конечно, вы должны определить методы. Пока вы можете получить имена:

List<string> resultNames = resultsMethods.Select(method => method.Name);
List<ReportResult> results = resultsMethods.Select(method => 
    Invoke(this, new object ["ASC", offset, limit]));
0 голосов
/ 30 октября 2019

Вы можете использовать оператор nameof для передачи имени вызываемого метода вместе с результатом метода в качестве кортежа в свой список:

List<(string, string)> results = new List<(string, string)>
{
    (nameof(GetInvalid), GetInvalid()),
    (nameof(GetActive), GetActive()),
    (nameof(GetValid), GetValid()),
};

foreach ((string MethodName, string Result) in results)
{
    Console.WriteLine($"Method: {MethodName}, Result: {Result}");
}

Thisдает следующие результаты:

enter image description here

0 голосов
/ 30 октября 2019

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

СпособЯ хотел бы сделать это:

var invalid = await GetInvalid("ASC", offset, limit);
var active = await GetActive("ASC", offset, limit);
var valid = await GetValid("ASC", offset, limit);

Поскольку они находятся в отдельных полях, очевидно, откуда берутся результаты.

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

class Results
{
    public ReportResult Invalid { get; set; }
    public ReportResult Valid { get; set; }
    public ReportResult Active { get; set; }
}

Если вам обоим нужно, чтобы они использовались по-разному И нужны они в списке, выполните вышеописанное, но дополните его списком.

var invalid = await GetInvalid("ASC", offset, limit);
var active = await GetActive("ASC", offset, limit);
var valid = await GetValid("ASC", offset, limit);
var results = new List<ReportResult>
{
    invalid, active, valid
};

Или

class Results
{
    public ReportResult Invalid { get; set; }
    public ReportResult Valid { get; set; }
    public ReportResult Active { get; set; }
    public List<ReportResult> AllResults => new List<ReportResult>{Invalid,Valid,Active};
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...