Лучший вариант, как вы предложили, создать интерфейс ISomeClass
и реализовать его. Недавно я решил ту же самую проблему с пользовательскими настройками и системой профилей, которую мы хотели использовать для хранения различных типов данных. Это сводилось к:
public interface IEntry
{
// ...
object Value { get; set; }
}
Определенный Entry<Single>
может быть создан, поскольку Entry<T>
неявно реализовал интерфейс:
public class Entry<T> : IEntry
{
T Value { get; set; }
object IEntry.Value { get { return Value; } set { return Value; } }
}
Но когда пришло время IDictionary<string,IEntry>
, мы вернулись к приведению экземпляров IEntry
к соответствующему типу Entry<T>
или свойству Value IEntry
к соответствующему типу.
// assume entries is IDictionary<string,IEntry>...
var entry = entries["pizza-weight"];
var weight = (float)entry.Value;
Это, конечно, все имеет смысл, потому что точно так же, как и SomeClass<int>
! = SomeClass<long>
, верно и 101 * *! = IList<SomeClass<long>>
.