Тип возврата динамического метода в C # - PullRequest
0 голосов
/ 29 июня 2018

Мне нужна твоя помощь. У меня есть следующая ситуация, с которой у меня есть метод, который должен определить некоторые условия и, в зависимости от этих условий, вернуть объект определенного типа.

Теперь я не хочу говорить public object methodXY() с object типом возвращаемого значения, но у меня есть подход, который пока не работает.

public T methodXY<T>()
{
if (condition A)
   return (T)Convert.ChangeType(myValue, typeof(myType));
else if (condition B)
   return (T)Convert.ChangeType(myValue, typeof(myOtherType));
else
   throw new exception("xyz")
}

Но при этом кажется, что я должен установить тип возвращаемого значения уже при вызове метода. Это то, чего я не хочу и не могу.

//myType looks like this
public class myType 
{
public string name;
public string firstname;
public string address;
}

и

//myOtherType looks like
public class myOtherType
{
public string name;
public string firstname;
}

Вам нужна более или более подробная информация? Дайте мне знать.

Заранее спасибо: -)

EDIT:

Вот полный пример кода метода с object

public object myMethod(MyDto myDto)
    {
        userHasRoles = GetUserRoles();

        if (userHasRoles .Contains("Admin"))
            return (mapper.Map<myType>(myDto));
        else if (userHasRoles.Contains("User"))
            return (mapper.Map<myOtherType>(myDto));

        throw new Exception("No elements!");
    }

1 Ответ

0 голосов
/ 29 июня 2018

Насколько я понимаю, вам нужно вернуть более полные данные, когда ретривер является администратором, и не очень полные, когда нет.

Если это цель, то вы можете извлечь соответствующие данные из базы данных и заполнить объект одного из следующих классов:

public class PersonData {
    public string Name { get; private set; }
    public string Surname { get; private set; }
}

public class ExtendedPersonData: PersonData {
    public string Name { get; private set; }
    public string Surname { get; private set; }
    public string Address { get; private set; }
}

Поскольку последний класс наследует от первого, вы можете просто создать List<PersonData>, и он будет охватывать оба случая.

Другой, другой подход: класс данных учитывает пользователя, чтобы возвращать или нет определенные данные:

class Person {
    public Person(User usr, string address)
    {
        this.User = usr;
        this.address = address;
    }

    public string User { get; private set; }
    public string Name { get; private set; }
    public string Surname { get; private set; }
    public string Address {
         get {
             string toret = "N/A";

             if ( this.User.IsAdmin() ) {
                 toret = this.address;
             }

             return toret;
         }
    }

    private string address;
}

Ни одно из обоих решений не является идеальным, и у обоих есть свои проблемы, но проблема, по крайней мере, как вы ее сформулировали, не может быть решена.

Надеюсь, это поможет.

...