如何确定ToString方法是否返回对象类型名称与实际值?

时间:2012-09-29 16:52:37

标签: .net caching tostring

我打算使用ToString()方法创建缓存键。此缓存将用于缓存方法级别调用,并且将使用参数名称和相应的值构造密钥。由于这个缓存是为大型库构建的,因此我无法确保每个方法只有值类型参数或所有类都实现序列化。我需要在运行时确定对ToString的调用是否返回实际值与类型名称,以便可以禁止该方法调用参与缓存。

对于Instance,请考虑以下方法及其调用

AccountDetails GetDetails(int groupId, Account account)
{
    var ac1 = new Account( accountId = 123 };
    var ac2 = new Account( accountId = 555 };
    var return1 = GetDetails(15, ac1);
    var return2 = GetDetails(15, ac2);
}

在这种情况下,我会将缓存键构造为“groupId = 15 + account = namespace.Account”,从而导致错误的冲突。我如何在运行时检测到我对account.GetString()的调用将返回一个类型名称?

2 个答案:

答案 0 :(得分:3)

您不应该将字符串用于常规缓存键。这真的不是ToString的设计目标。相反,您应该使用EqualsGetHashCode来检查是否相等。当然,与ToString一样,每个对象都有EqualsGetHashCode方法......但幸运的是,IEquatable<T>界面提供了更强的信号,表明某种类型实际上设计是为了平等。

因此,对于任何给定类型X,只需检查该类型是否实现IEquatable<X>。如果是,则用作缓存密钥应该是合理的。如果您正在编写通用方法,则可以强制执行此操作:

void Foo<T>(T key, /* other parameters */) where T : IEquatable<T>

答案 1 :(得分:0)

我不知道“ToString”方法中的实现是什么(就是你知道,有人在“对象”中重载了“ToString”,但实现方式与在“对象”中实现的方式相同)。

您不能将ToString用作对象的一种哈希。考虑两个逻辑上不同的对象,例如具有相同全名和不同ID的两个“Student”对象(或者像图片一样的非ascii值)。您需要使用真正的哈希 - 请参阅“GetHashCode”。

如果“GetHashCode”不是一个选项,我们将需要更多信息(如“为什么”)