2010-11-09 80 views
3

使用MethodBase,是否可以獲取被調用方法的參數及其值?如何使用Reflection獲取方法中的參數值?

具體來說,我試圖使用反射來創建緩存鍵。由於每種方法及其參數列表都是獨一無二的,所以我認爲以此爲關鍵是理想的。這是我在做什麼:

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; 
    } 

回答

2

你爲什麼要使用反射?在你使用GetCacheKey方法的地方你知道參數的值。你可以指定它們:

public string GetCacheKey(params object[] parameters) 

而且使用這樣的:

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

嗨安德魯,這要求我必須每次寫入每個參數的名稱作爲'GetCacheKey()'的參數。如果可以的話,我想避免這種情況。如果我可以動態地獲取這些值,它會爲我節省很多打字量。 – DaveDev 2010-11-09 12:25:22

+0

@DaveDev:我明白你的觀點。請記住,顯式傳遞參數比使用反射快得多。 – 2010-11-09 13:43:37

0

這是從方法得到的參數有很大的樣品:

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; 
} 
+0

我想他想得到參數的**值** ...要困難得多...(不必要的) – 2010-11-09 12:18:56

+0

布拉德利是正確的 - 我想要的值。但是,我不認爲這是完全沒有必要的。如果我可以動態獲取這些值,那麼我不需要像上面的例子中所示的那樣將參數添加到'GetCacheKey()'中。 – DaveDev 2010-11-09 12:27:46

0

尋找相同的答案正確。除了反思,你可以在PostSharp中編寫一個方面。這將削減使用反射的任何性能影響,並且不會違反任何替代原則。

相關問題