У меня есть ConcurrentDictionary:ConcurrentDictionary.GetOrAdd(): valueFactory с другой сигнатурой
private static ConcurrentDictionary<int, string> _cd = new ConcurrentDictionary<int, string>();
быть консервативным, фактический ключ, который будет использоваться для извлечения элементов является объектом, но вместо этого я просто использовать его хэш-код, ключ так, чтобы (потенциально большой) объект не является ключом:
public static string GetTheValue(Foo foo)
{
int keyCode = foo.GetHashCode(); // GetHashCode is overridden to guarantee uniqueness
string theValue = _cd.GetOrAdd(keyCode, FooFactory);
return theValue;
}
Однако, мне нужны различные свойства объекта Foo при подготовке объекта на заводе:
private static string FooFactory(Foo foo)
{
string result = null;
object propA = foo.A;
object propB = foo.B;
// ... here be magic to set result
return result;
}
Поскольку параметр valueFactory GetOrAdd() ожидает Func<int, string>
, похоже, что я не могу передать свой объект Foo. Неужели это возможно?
Не делайте этого. HashCodes не уникальны. Вы должны использовать большой объект; это не повредит. – SLaks
@SLaks: Предположим, я использую ToString() вместо GetHashCode(). – Bullines
** Просто не **. – SLaks