解决了! 这个工作,我需要告诉编译器T当然实现IEquatable ...
public static bool secureEquals<T>(T obj1, object obj2)
where T: class, IEquatable<T>
{...
public static bool secureEquals<T>(T obj1, T obj2)
where T: class, IEquatable<T>
{....
Run Code Online (Sandbox Code Playgroud)
题:
我试图将IEquatable实现和Equals覆盖的重复功能放入一个单独的静态类中,如下所示:
public static class EqualsHelper
{
public static bool secureEquals<T>(T obj1, object obj2)
where T : class
{
if (obj2 is T)
{
return secureEquals(obj1, obj2 as T);
}
else
{
return false;
}
}
public static bool secureEquals<T>(T obj1, T obj2)
{
if (obj1 == null)
{
if (obj2 != null) …Run Code Online (Sandbox Code Playgroud) 对于缓存类,如果对象被垃圾收集(从我的缓存中删除相应的条目),我需要得到通知.这样做的最佳方法是什么?从析构函数发送事件?
我正在编写一个cacher/memoizer,用于获取一个巨大的参数树对象和许多小值类型参数的函数,例如,
double myFunc(HugeParTree parTree, int dynPar1, double dynPar2)
Run Code Online (Sandbox Code Playgroud)
我想以下列方式缓存这些函数:
parTree很少发生变化时,所有相应的缓存条目都将被删除(通过Observer模式).(parTree.Equals()太贵了;它比较了100多种价值类型).代码现在看起来像这样(对于一个值参数):
public class CachedFunction1ObsPar1Par<TRet, TObsPar1, TPar1>
where TObsPar1 : IObservable, IProvideGUID
{
public delegate TRet ValueCalculator(TObsPar1 obsPar1, TPar1 par1);
public CachedFunction1ObsPar1Par(ValueCalculator calc)
{
_calc = calc;
}
#region members
private ValueCalculator _calc;
private Dictionary<Guid, Dictionary<TPar1, TRet>> _cache =
new Dictionary<Guid, Dictionary<TPar1,TRet>>();
#endregion
public TRet value(TObsPar1 obsPar1, TPar1 par1)
{
TRet result;
bool cacheHit = checkCache(obsPar1, par1, out result);
if (cacheHit)
{
Debug.Assert(result.Equals(_calc(obsPar1, …Run Code Online (Sandbox Code Playgroud) 如果我有
abstract class Base<TSub>
{
protected static List<TSub> MyStaticList;
}
class DerivedA : Base<DerivedA>
{
}
class DerivedB : Base<DerivedB>
{
}
Run Code Online (Sandbox Code Playgroud)
我得到两个独立的MyStaticList变量,每个基类一个.如果相反,基地看起来像这样
class Base<TSub>
{
protected static List<string> MyStaticList;
}
Run Code Online (Sandbox Code Playgroud)
即,模板参数没有使用,我保证仍然得到两个独立的MyStaticList变量?
(我需要这个用于availableValues()自定义类Enum类层次结构的方法.)