Как получить значения параметров в методе с отражением? - PullRequest
3 голосов
/ 09 ноября 2010

Используя MethodBase, возможно ли получить параметры и их значения вызываемого метода?

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

    public List<Company> GetCompanies(string city)
    {
        string key = GetCacheKey();

        var companies = _cachingService.GetCacheItem(key);
        if (null == company)
        {
            companies = _companyRepository.GetCompaniesByCity(city);
            AddCacheItem(key, companies);
        }

        return (List<Company>)companies;
    }

    public List<Company> GetCompanies(string city, int size)
    {
        string key = GetCacheKey();

        var companies = _cachingService.GetCacheItem(key);
        if (null == company)
        {
            companies = _companyRepository.GetCompaniesByCityAndSize(city, size);
            AddCacheItem(key, companies);
        }

        return (List<Company>)companies;
    }

Где GetCacheKey() определяется (приблизительно) как:

    public string GetCacheKey()
    {
        StackTrace stackTrace = new StackTrace();
        MethodBase methodBase = stackTrace.GetFrame(1).GetMethod();
        string name = methodBase.DeclaringType.FullName;

        // get values of each parameter and append to a string
        string parameterVals = // How can I get the param values?

        return name + parameterVals;
    }

Ответы [ 3 ]

2 голосов
/ 09 ноября 2010

Почему вы хотите использовать отражение?В том месте, где вы используете свой метод GetCacheKey, вы знаете значения параметров.Вы можете просто указать их:

public string GetCacheKey(params object[] parameters)

И использовать так:

public List<Company> GetCompanies(string city)
{
    string key = GetCacheKey(city);
    ...
0 голосов
/ 05 апреля 2013

Глядя на тот же ответ правильно.Помимо размышлений вы можете написать Аспект в PostSharp.Это снизит любое влияние на производительность при использовании отражения и не нарушит никаких принципов замещения.

0 голосов
/ 09 ноября 2010

Это отличный пример для получения параметров из метода:

 public static string GetParamName(System.Reflection.MethodInfo method, int index)
{
    string retVal = string.Empty;
    if (method != null && method.GetParameters().Length > index)
        retVal = method.GetParameters()[index].Name;
    return retVal;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...