Легко объявить метод, который принимает имя метода в виде строки:
public void DoSomethingWithMethodName(string methodName)
{
// Do something with the method name here.
}
и вызовите его как:
DoSomethingWithMethodName(nameof(SomeClass.SomeMethod));
Я хочу избавиться от nameof
и вызвать другой метод:
DoSomethingWithMethod(SomeClass.SomeMethod);
а затем иметь возможность получить имя метода так же, как в примере выше. «Чувствуется» возможность сделать это, используя некоторое колдовство Expression
и/или Func
. Вопрос в том, какую подпись должен иметь этот DoSomethingWithMethod
и что он должен делать на самом деле!
====================================
Вопрос, кажется, вызывает много путаницы, и ответы предполагают то, чего я не спрашивал. Вот намек на то, к чему я стремлюсь, но не могу сделать правильно. Это для какой-то другой проблемы (для которой у меня есть решение). Я могу заявить:
private async Task CheckDictionary(Expression<Func<LookupDictionary>> property, int? expectedIndex = null)
{
await RunTest(async wb =>
{
var isFirst = true;
foreach (var variable in property.Compile().Invoke())
{
// Pass the override value for the first index.
await CheckSetLookupIndex(wb, GetPathOfProperty(property), variable, isFirst ? expectedIndex : null);
isFirst = false;
}
});
}
где GetPathOfProperty
взято из: https://www.automatetheplanet.com/get-property-names-using-lambda-expressions/ и Полное имя свойства а>
а затем используйте:
[Fact]
public async Task CommercialExcelRaterService_ShouldNotThrowOnNumberOfStories() =>
await CheckDictionary(() => EqNumberOfStories, 2);
где EqNumberOfStories
это:
public static LookupDictionary EqNumberOfStories { get; } = new LookupDictionary(new Dictionary<int, string>
{
{ 1, "" },
{ 2, "1 to 8" },
{ 3, "9 to 20" },
{ 4, "Over 20" }
});
Как видите, я передаю свойство, а затем «раскручиваю» его, чтобы добраться до источника. Я хотел бы сделать то же самое, но в более простой настройке, как описано выше.
Func<T, TResult>
Делегировать? - person Rufus L   schedule 26.06.2018DoSomethingWithMethod(SomeClass.SomeMethod)
проще, чемDoSomethingWithMethodName(nameof(SomeClass.SomeMethod))
) то стоит попробовать даже ценой сложности реализации лежащего в основе метода. - person Konstantin Konstantinov   schedule 26.06.2018nameof
встроен в фреймворк, и должна быть основная причина, по которой кто-то не захочет использовать его и создать свою собственную версию. Я считаю, что отсутствие необходимости набиратьnameof
не является одним из них. - person Mayank   schedule 26.06.2018SomeClass.SomeMethod
и, следовательно, нет возможности использовать StackTrace, чтобы добраться до верхнего имени, потому что его нет! Выражения могут помочь, но я просто не знаю, какие именно. - person Konstantin Konstantinov   schedule 26.06.2018SomeClass.GetMethodName( x=> x.Method)
- person TheGeneral   schedule 26.06.2018GetMyName(SomeClass.Method)
это помогло бы? потому что я мог бы сократить это доnameof
видите, что я там сделал? - person TheGeneral   schedule 26.06.2018