C#中的动态方法返回类型

时间:2018-06-29 06:22:10

标签: c# methods dynamic types

我需要你的帮助。我遇到以下情况,我有一种方法必须确定一些条件,并根据这些条件返回特定类型的对象。

现在,我不想将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;
}

您需要更多或更详细的信息吗?让我知道。

预先感谢:-)

编辑:

这是使用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 :(得分:1)

据我了解的问题,当检索者是管理员时,您需要返回更完整的数据,否则请返回一个不太完整的数据。

如果这是目标,那么您可以从数据库中检索适当的数据并填写以下类别之一的对象:

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;
}

这两种解决方案都不是完美的,并且都有各自的问题,但是至少不能解决您所说的问题。

希望这会有所帮助。