如何避免屬性獲取器中的遞歸調用?這是我簡單的代碼屬性獲取器中使用的遞歸表達式
public class UploadAttribute : Attribute
{
private Type _resourceType;
private string _select;
private string _change;
private string _remove;
public Type ResourceType
{
get { return _resourceType; }
set { _resourceType = value; }
}
public string Select
{
get { return GetResourceText(m => m.Select, "Select..."); }
set { _select = value; }
}
public string Change
{
get { return GetResourceText(m => m.Change, "Change..."); }
set { _change = value; }
}
public string Remove
{
get { return GetResourceText(m => m.Remove, "Remove"); }
set { _remove = value; }
}
private string GetResourceText(Expression<Func<UploadAttribute, string>> expression, string @default)
{
var value = expression.Compile().Invoke(this); // here .net is creating new UploadAttribute instance and use it for expression fnc
var result = value ?? @default;
if (_resourceType != null && !string.IsNullOrEmpty(value))
{
ResourceManager rm = new ResourceManager(_resourceType);
try
{
result = rm.GetString(value);
}
catch
{
// if string wasn't found in resource file than use what user specify; don't by big brother.
}
}
return result;
}
}
但是,如果你看一下方法GetResourceText,有行,我需要編譯並調用表達以獲取給定的屬性值。不幸的是,這個操作創建了UploadAttribute的新實例。在那一刻,.net通過所有屬性並調用getter,如果我沒有弄錯,並且在getter中.net編譯並調用表達式來獲取值或給定屬性,再次一次又一次地發生到StackOverlowException。 你能告訴我如何避免這種行爲,但簡單的解決方案?
編輯:該類的作用是爲按鈕提供標題 - 用戶設置了哪些用戶可以使用資源管理器中的多語言標題。 在上面的例子中,按鈕選擇從資源翻譯,對於更改按鈕,使用默認文本「更改...」和刪除按鈕標題「銷燬此@ &#!」。因此,如果用戶沒有指定屬性值,那麼應用程序使用默認文本,否則嘗試在資源中查找文本,並且如果找到匹配,則使用來自資源的文本,否則使用用戶設置的內容。
[Required]
[Upload(ResourceType = typeof(Resource), Select = "UploadSelect", Remove = "Destroy this @&#!")]
public HttpPostedFileBase Logo { get; set; }
看來,你的屬性的屬性值設置爲兩種不同的價值觀: (1)用於從資源中檢索標題字符串的資源鍵,(2)將被用作標題本身的文字字符串。這絕對不是一個乾淨的方式,儘管我絕不會選擇像這樣的脆弱設計解決方案,但我想它可以工作。根據我對你的目的的新理解,我會更新我的答案。 – Alex 2015-04-05 22:49:17
對於我來說,這個代碼應該做什麼並不清楚。也許你可以澄清你的意圖,然後你可能會得到一個滿足你的要求的答案:) – MBoros 2015-04-06 10:59:05
@SebastianBusek你能指出是否有任何答案充分解決了你的問題,或者指出你有什麼問題。或者,如果您找到一種以不同方式自己解決問題的方法,請將其作爲答案。 – Alex 2015-04-13 12:13:55