Ну как на счет этого
public interface MyReference{
int Id{get;set;}
}
public class SimpleReference : MyReference
{
public int Id{get;set;}
}
public class CompoundReference<T> : MyReference
{
public int Id{get;set;}
public T TValue{get;set;}
}
public class ReferenceCollection : KeyedCollection<int, MyReference>
{
protected override int GetKeyForItem(MyReference item)
{
return item.Id;
}
}
И вы можете использовать как
SimpleReference sr = new SimpleReference(){Id=1};
CompoundReference<string> cr = new CompoundReference<string>(){Id=2,TValue="Test"};
ReferenceCollection col = new ReferenceCollection();
col.Add(sr);
col.Add(cr);
Console.WriteLine(col.Contains(1)); //true
Console.WriteLine(col.Contains(2)); //true
Console.WriteLine(col.Contains(3)); //false
var i1 = col[1]; //returns sr
var i2 = col[2]; //return cr