Имя сборки в методе возвращает унаследованное имя класса - PullRequest
0 голосов
/ 14 января 2019

хорошо, вы правы, что я не очень хорошо это объяснил.

У меня есть клиентское приложение и служба WCF сервера. Для передачи всех данных от клиента к серверу у меня есть 1 серверный API. Этот API ожидает словарь для передачи параметров. Когда я передаю int, string, ... все идет хорошо. Но я не могу сделать то же самое с классами. Поэтому я использую сериализацию этого класса на стороне клиента и десериализацию на классе сервера. Для десериализации мне нужно знать тип класса на стороне сервера. Поэтому я поместил параметр «AssemblyFullName» в BaseClass. Все мои классы наследуются от BaseClass.

Для связи с сервером у меня есть 1 способ. Каждое общение происходит с помощью этого метода.

internal static void Execute(Dictionary<string, object> parameters)
{
    //finding type of object in parameters
    foreach (KeyValuePair<string, object> keyValuePair in parameters)
    {
        // problem row
        string fullName = keyValuePair.Value.GetType().FullName;
    }

    // rutine for comunication with server
}

Моя модель выглядит так, и она включена на стороне сервера и клиента.

public class BaseClass
{
    private string AssemblyFullName { get; set; }
}

public class A : BaseClass
{

}

public class B : A
{

}

Один метод на стороне клиента ожидает "A" и соединяется с сервером.

public void ClientMethod(A expectedClass)
{
    Execute(new Dictionary<string, object>() { { "identifierOfClassA", expectedClass } });
}

Вызов метода «Выполнить» всегда осуществляется через «ClientMethod» в этом типе.

A a = new A();
ClientMethod(a);

B b = new B();
ClientMethod(b);

Суть этого поста в том, почему строка в методе «Execute» возвращает «namespace.A» или «namespace.B»? Почему не всегда возвращается «namespace.A»? Я вызываю его из метода "ClientMethod", который ожидает только "A".

Надеюсь, теперь это станет для вас более ясным.

С наилучшими пожеланиями Томас.

1 Ответ

0 голосов
/ 14 января 2019

Почему второй использует возврат «B» вместо «A»? «Другой метод» ожидают «А». В любом случае этот метод может вернуть «A» в обоих примерах?

Да, конечно, есть:

public string AnotherMethod(A parameter)
{
    return typeof(A).FullName;
}

Но возникает несколько вопросов:

  1. Почему метод с именем GetAssemblyName при возврате полного имени типа?
  2. Если вы всегда хотите вернуть полное имя A, зачем вам вообще нужен parameter? Зачем тебе вообще нужен метод? typeof(A) отлично справляется.
  3. Если вы пытаетесь что-то еще, проясните вопрос. В нынешнем виде это сбивает с толку.
...