Нет способа (по крайней мере, не совсем хакерского) хешировать анонимную функцию / делегат.Даже если реализация функции одинакова, это может быть закрытием, поэтому результат проверки может отличаться в зависимости от состояния контекста.Рассмотрим следующий пример:
public class Validator
{
public string SomeState { get; set; }
public Validator(string someState)
{
SomeState = someState;
}
public bool IsValid(string input)
{
return input == SomeState;
}
}
// assume your 'input' being validated is "foo"
GetContent((new Validator("foo")).IsValid); // IsValid returns true
GetContent((new Validator("bar")).IsValid); // IsValid returns false
Таким образом, единственный способ убедиться в том, что функция проверки уникальна, состоит в том, чтобы вызывающая сторона определяла уникальность реализации проверки и передавала эту информацию вам.Вам нужно будет переключиться на использование какого-либо интерфейса валидатора, например:
//
// Your code
//
public string GetContent(IValidator validator,
IEqualityComparer<IValidator> comparer)
{
// for tracking used validators, use instance
// of 'new HashSet<IValidator>(comparer)'
// this will give you a hashset of unique validators
}
public interface IValidator
{
bool IsValid(string input);
}
//
// Your callers code
//
public class Validator : IValidator
{
// same as Validator class code above
}
public class ValidatorEqualityComparer : IEqualityComparer<Validator>
{
public bool Equals(Validator v1, Validator v2)
{
return GetHashCode(v1) == GetHashCode(v2);
}
public int GetHashCode(Validator v)
{
int hCode = GetMyStringHash(v.GetType().GUID.ToString() + v.SomeState);
// as for GetMyStringHash() implementation for this example,
// you can use some simple string hashing:
// http://www.techlicity.com/blog/dotnet-hash-algorithms.html
return hCode;
}
}
Затем вы можете вызвать свой метод следующим образом:
GetContent(new Validator("foo"), new ValidatorEqualityComparer());
Итак, Самая важная часть , на которую следует обратить внимание, это то, что при реализации ValidatorEqualityComparer.GetHashCode()
вы используете средство проверки состояния объекта (на основе значения объекта) .Только это обеспечит истинную уникальность логики валидации.