Как применить пользовательский двунаправленный граф из QuickGraph к GraphLayout из Graph#?
В чем дело?
using QuickGraph;
using GraphSharp;
public class State
{
public string Name { get; set; }
public override string ToString()
{
return Name;
}
}
public class Event
{
public string Name;
public override string ToString()
{
return Name;
}
}
BidirectionalGraph<State, TaggedEdge<State, Event>> x =
new BidirectionalGraph<State, TaggedEdge<State, Event>>();
GraphLayout graphLayout = new GraphLayout();
graphLayout.Graph = x;
Ошибка:
Невозможно неявно преобразовать тип QuickGraph.BidirectionalGraph<ChashaGraphSharp.State,QuickGraph.TaggedEdge<ChashaGraphSharp.State,ChashaGraphSharp.Event>>
в QuickGraph.IBidirectionalGraph<object,QuickGraph.IEdge<object>>
, Существует явное преобразование (вам не хватает приведения?)
Если я поставлю приведение, то приложение получит ошибку при запуске без какой-либо информации
В чем дело?
3 ответа
Вам нужно создать свой экземпляр BidirectionGraph, используя тип IEdge вместо TaggedEdge:
BidirectionalGraph<State, IEdge<State, Event>> x =
new BidirectionalGraph<State, IEdge<State, Event>>();
Я не могу сказать, что полностью понимаю, почему это так, однако вышесказанное должно работать.
РЕДАКТИРОВАТЬ: Я задал вопрос, который как бы объясняет, почему этот актерский состав не работает.
Если вы используете пользовательский график (IE не "BidirectionalGraph<Object, IEdge<Object>
") Вам нужно использовать пользовательский GraphLayout, который наследуется от"ContextualGraphLayout
"
Здесь вместо использованияGraphLayout
"использовать"ContextualGraphLayout<State,Edge<<State>>,BidirectionalGraph<State, Edge<State>>>
".
Я настоятельно советую создавать фиктивные классы моделей для удобства чтения. Например:
public MyVertex : State { } public MyEdge : Edge<MyVertex> { public MyEdge (MyVertex source, MyVertex target) : base(source, target) { }
}
public MyGraph : BidirectionalGraph<MyVertex, MyEdge> { } public MyGraphLayout : ContextualGraphLayout<MyVertex, MyEdge, MyGraph> { public MyGraphLayout () : base() { } public MyGraphLayout (bool allowParallelEdges) : base(allowParallelEdges) { } public MyGraphLayout (bool allowParallelEdges, int vertexCapacity) : base(allowParallelEdges, vertexCapacity) { }
}
Да
Но TaggedEdge не реализует интерфейс IEdge Как использовать пользовательские TaggedEdge?