Указание нескольких интерфейсов для параметра

У меня есть объект, который реализует два интерфейса... Интерфейсы:

public interface IObject
{
    string Name { get; }
    string Class { get; }
    IEnumerable<IObjectProperty> Properties { get; }
}
public interface ITreeNode<T>
{
    T Parent { get; }
    IEnumerable<T> Children { get; }
}

такое, что

public class ObjectNode : IObject, ITreeNode<IObject>
{
    public string Class { get; private set; }
    public string Name { get; private set; }
    public IEnumerable<IObjectProperty> Properties { get; set; }
    public IEnumerable<IObject> Children { get; private set; }
    public IObject Parent { get; private set; }
}

Теперь у меня есть функция, которая нуждается в одном из своих параметров для реализации обоих этих интерфейсов. Как я могу указать, что в С#?

Примером может быть

public TypedObject(ITreeNode<IObject> baseObject, IEnumerable<IType> types, ITreeNode<IObject>, IObject parent)
{
    //Construct here
}

Или проблема в том, что мой дизайн неправильный, и я должен как-то реализовать оба интерфейса на одном интерфейсе

Ответ 1

public void Foo<T>(T myParam)
    where T : IObject, ITreeNode<IObject>
{
    // whatever
}

Ответ 2

В С# интерфейсы сами могут наследовать один или несколько других интерфейсов. Таким образом, одним из решений было бы определить интерфейс, скажем IObjectTreeNode<T>, который выводится как из IObject, так и ITreeNode<T>.

Ответ 3

Возможно, проще всего определить интерфейс, реализующий IObject и ITreeNode.

public interface IObjectNode<T> : IObject, ITreeNode<T>
{
}

Еще один вариант, если вы не ожидаете, что указанный выше интерфейс будет использоваться часто, заключается в том, чтобы сделать метод/функцию под вопросом общим.

public void Foo<T>(T objectNode) where T : IObject, ITreeNode<IObject>

Ответ 4

public  void MethodName<TParam1, TParam2>(TParam1 param1, TParam2 param2) 
    where TParam1 : IObject
    where TParam2 : ITreeNode<IObject>