假設它並不總是你想要一個int
- 我認爲像這樣的工作,並非常接近得到(如果是的話,爲什麼不是一個Dictionary<string, int>
?):
int i = @int["Key"];
string s = @string["Key"];
object o = @object["Key"];
這個結合了事實上標識符的前綴可以是@
(通常是可選的,但如果標識符是reserved keyword,比如int或字符串,則需要它),默認索引參數爲Andrew Hare's answer。
它確實需要另一個類,以用於獲取索引 - 但如果你想用括號而非方括號鍵名,你可以使用方法代替:
int i = @value<int>("Key");
實現會是這樣像:
class DerivedClass : BaseClass {
void Main() {
int i = @int["Key"];
}
}
abstract class BaseClass {
private Dictionary<string, string> D { get; set; }
protected Indexer<int> @int = new Indexer<int>(s => int.Parse(s), this);
protected Indexer<string> @string = new Indexer<string>(s => s, this);
protected Indexer<object> @object = new Indexer<object>(s => (object)s, this);
protected class Indexer<T> {
public T this[string key] {
get { return this.Convert(this.BaseClass.D[key]); }
}
private T Convert(string value) { get; set; }
private BaseClass { get; set; }
public Indexer(Func<T, string> c, BaseClass b) {
this.Convert = c;
this.BaseClass = b;
}
}
}
或者,方法途徑:
class DerivedClass : BaseClass {
void Main() {
int i = @value<int>("key");
}
}
abstract class BaseClass {
private Dictionary<string, string> D { get; set; }
protected T @value<T>(string key) {
string s = this.D[s];
return Convert.ChangeType(s, typeof(T));
}
}
在通過language spec閱讀之後 - 如果您未綁定到@
,則_
是合法標識符。結合索引器,你會得到:
int i = _["key"];
你喜歡這種語法嗎? int result = Fields [key]; ? – 2010-03-16 16:59:19
這是一個很好的例子,你*不想*使用TryParse()。你用它來捕捉用戶的錯誤,他們是正常的。你真的必須在這裏使用Parse()來捕捉編程錯誤。 TryGetValue出於同樣的原因是錯誤的。 – 2010-03-16 18:26:54
爲什麼你的字典是私人的,不受保護是否有特殊原因? (假設它是私有的) – 2010-03-17 13:29:39