この質問の末尾に記載されているクラスを「一般化」できる人はいますか?クラスを "GetStateDelegate"型の代理人にロックしないようにしたいですが、一般的な代理人です。それは可能ですか?このクラスを一般的なクラスにすることはできますか?
私は物事のカップルを試してみたが、1)C#は、この種のクラス宣言を好きではない:
public class StringToMethodMapper<T> where T: System.Delegate
これは
「型パラメータ制約としてSystem.Delegateを使用することはできません」得正しい軌道に乗るためのヒントがありがたいです。また、ソリューションが存在する場合、私は消費者ができるだけ変更の影響を受けないようにしたい。たとえば、 "Add(string、delegate)"の呼び出しコードを変更しないでください。
コード:これを行うには
public delegate bool GetStateDelegate(object someObject);
public class StringToMethodMapper
{
private Dictionary<string, GetStateDelegate> _methods;
public StringToMethodMapper()
{
_methods = new Dictionary<string, GetStateDelegate>();
}
public void Add(string key, GetStateDelegate method)
{
_methods.Add(key, method);
}
internal virtual GetStateDelegate GetMethodFor(string key)
{
foreach (var storedKey in _methods.Keys)
{
if (key.ToUpper().StartsWith(storedKey.ToUpper()))
{
return _methods[storedKey];
}
}
return null;
}
}
TrygetValueを使うことができないので、StartsWithの相変わらずのことがポイントです。私の元のコードでは、例外をスローする重複したマッチのチェックがありますが、質問のためにはそれが重要です。私はあなたの図書館を見ていきます - 面白そうです! – Nilzor
...と私はあなたが代理人の_any_種類を持つことはできないと言って私の質問に答えると思います。 – Nilzor
@Nilzor:まあ、ILのリライティング手法でのみ。 –