Одним из вариантов решения таких проблем является применение шаблона адаптера к вашим классам. В этом случае они имеют одинаковые свойства, но не одинаковый интерфейс. (Это наиболее полезно, если вы не управляете источником или для них не имеет смысла фактически использовать интерфейс в обычных сценариях.)
interface ILinkablePath
{
string LinkPath { get; }
}
class LinkBaseAdapter : ILinkablePath
{
private LinkBase linkBase;
public LinkBaseAdapter(LinkBase linkBase)
{
this.linkBase = linkBase;
}
public string LinkPath { get { return this.linkBase.LinkPath; } }
}
Вы можете написать адаптер для каждого класса, который хотите поддерживать. Если они не разделяют общий интерфейс и, возможно, даже не разделяют общие методы или свойства (по имени, если не по исполнению), то вы можете использовать эту технику, если хотите использовать классы таким же образом.
Когда вы это сделаете, вы сможете аккуратно работать с адаптивным интерфейсом в ваших методах.
В противном случае для вашей конкретной проблемы вы можете просто создать различные методы для каждого типа, который вы хотите поддерживать, или (если вы работаете только с одним свойством, а не с остальным объектом), просто передайте значение свойства, которое вы хотите использовать, а не сам объект.