У меня проблема с библиотекой классов C# и службой сервиса WCF. Я построил библиотеку классов с двумя классами Graph и Vertice. И у них мало общественных методов внутри. Затем я создал и опубликовал (IIS 7) простое приложение WCF, которое использует эту библиотеку классов. Код:Библиотека классов C# в приложении службы WCF
public class GraphsService : IGraphsService
{
public Graph getGraph(int val)
{
return new Graph(val);
}
}
Конечно публиковать процесс пошел хорошо, и у меня есть доступ к WCF. И теперь проблема:
Когда я создал клиентское приложение (Web) и добавил ссылку на службу к этому проекту, я могу получить доступ к методу getGraph (int val), но он возвращает класс, который не имеет ни одного из методов I реализован в библиотеке классов. Код для клиента:
protected void Page_Load(object sender, EventArgs e)
{
GraphsServiceClient gc = new GraphsServiceClient();
Graph g = gc.getGraph(5);
lblGraph.Text = g.ToString();
}
Эта линия возвращает мне
GraphsClient.GraphService.Graph
Но я хочу, чтобы вернуть мой переопределен метод ToString (который реализуется в библиотеке классов). Как я могу заставить его работать?
Мой Graph класс из класса библиотеки (удалены несколько методов:
public class Graph
{
protected List<Vertice> _vertices;
public Graph()
{
this._vertices = new List<Vertice>();
}
public Graph(int startValue)
{
this._vertices = new List<Vertice>();
this._vertices.Add(new Vertice(startValue));
}
public List<Vertice> Vertices
{
get
{
return this._vertices;
}
}
public Vertice getFirstVertice()
{
if (this._vertices.Count != 0) return this._vertices.First();
throw new GraphException("Graaph doesn't have any vertices in it!");
}
public Vertice findVertice(int value)
{
foreach (Vertice v in this._vertices)
{
if (v.value == value) return v;
}
return null;
}
public Graph addVertice(Vertice v, bool undirected = true)
{
if (this._vertices.Contains(v)) throw new GraphException("There is already this vertice in graph!");
foreach (int val in v.Neighbours)
{
Vertice tmp = this.findVertice(val);
if (tmp != null)
{
if (undirected) tmp.addNeighbour(v.value);
}
else throw new GraphException("There isn't a vertice " + val + " in graph so it can't be in neighbours list!");
}
this._vertices.Add(v);
return this;
}
public int[,] getAdjacencyMatrix()
{
int[,] adMatrix = new int[this._vertices.Count + 1, this._vertices.Count + 1];
Array.Clear(adMatrix, 0, adMatrix.Length);
int l = 1;
foreach (Vertice v in this._vertices)
{
adMatrix[0, l] = v.value;
adMatrix[l, 0] = v.value;
l++;
}
for (int i = 1; i < this._vertices.Count + 1; i++)
{
for (int j = 1; j < this._vertices.Count + 1; j++)
{
int val1 = adMatrix[i, 0];
int val2 = adMatrix[0, j];
Vertice v = this.findVertice(val1);
if (v.hasNeighbour(val2)) adMatrix[i, j] = v.countNeighbours(val2);
}
}
return adMatrix;
}
public string getAdjacencyMatrixAsString()
{
string ret = "";
int[,] adM = this.getAdjacencyMatrix();
for (int i = 0; i < Math.Sqrt((double)adM.Length); i++)
{
for (int j = 0; j < Math.Sqrt((double)adM.Length); j++)
{
if (i != 0 || j != 0) ret += adM[i, j] + "\t";
else ret += "\t";
}
ret += "\n";
}
return ret;
}
public override string ToString()
{
string ret = "";
foreach (Vertice v in this._vertices)
{
ret += "Vertice: " + v.value + " neighbours: ";
foreach (int val in v.Neighbours)
{
ret += val + ", ";
}
ret = ret.Remove(ret.Length - 2);
ret += "\n";
}
ret = ret.Remove(ret.Length - 1);
return ret;
}
}
Вы возвращаете объект «Graph» из вашей службы WCF. Отправьте класс 'Graph' и сообщите нам, какое свойство из этого класса вы хотите отобразить. Как сейчас, он пытается преобразовать весь класс 'Graph' в строку, которая, если вы не переопределите' ToString', просто вернет имя типа. Нам нужно посмотреть, как вы его преодолели, потому что что-то в классе «Граф» неверно. –
Метод ToString переопределен, а в приложении клиента я не вижу никаких методов, реализованных в библиотеке классов. –
Не могли бы вы проверить пространство имен Graph в Page_Load? Я боюсь, что вы используете * сгенерированный мной код * не ваш класс – sac1