1

我有这种方法,我确信这是我遇到的另一个问题的根源。我相信这是因为这个方法返回的是一种类型,object而不是它实际返回的三种具体类型之一。

这是方法:

public object GetData(TableType type)
{
    switch (type)
    {
        case TableType.Person:
            return new Domain.PersonList(_personRepository.Get());
        case TableType.Event:
            return new Domain.EventList(_eventRepository.Get());
        case TableType.User:
            return new Domain.UserList(_userRepository.Get());
    }

    return null;
}

如何修改此方法以返回除 之外的类型object

4

6 回答 6

2

你需要的是泛型。这样该方法将根据返回类型type

例如,此方法返回TService类型:

private TService GetService<TService>(ServiceInfo serviceInfo)
    where TService : class, ICoordinationExecutionService
{
    var service = _executionServices.FirstOrDefault(
            x => x.ServiceInfo.InstanceInfo.InstanceId == serviceInfo.InstanceInfo.InstanceId
                && serviceInfo.ServiceTypeName.Equals(x.ServiceInfo.ServiceTypeName));

    if (service == null)
    {
        throw new Exception("invalid service ");
    }

    return _directory.GetService<TService>(service.ServiceInfo);
}
于 2013-10-21T19:46:55.997 回答
1

你可以使用泛型来完成这项工作,

public T GetData<T>()
{
    if(typeof(T) == typeof(Domain.PersonList))
        return new Domain.PersonList(_personRepository.Get());
    else if (typeof(T) == typeof(Domain.EventList))
        return new Domain.EventList(_eventRepository.Get());
    else if (typeof(T) == typeof(Domain.UserList))
        return new Domain.UserList(_userRepository.Get());
    }

    return default(T);
}
于 2013-10-21T19:59:57.253 回答
1

首先,您必须确定这三种存储库的“最小公分母”基类是什么。如果您没有,那么您应该创建一个。一种方法是

public abstract class repositoryBase
{
   public virtual IList<repositoryBase> Get() { }
}

然后三个类中的每一个都从 repositoryBase 继承:

public personRepository : repositoryBase
{
   public override IList<personRepository> Get()
   {
      // code here to return the list
   }
}

一旦您以这种方式重构了类层次结构,那么您甚至不需要 GetData 方法。在调用 GetData 的地方,现在只需调用 someRepository.Get();

如果您已经从其他东西继承并且向基类添加 Get 方法不合适,您可以使用接口执行我在此处描述的相同操作。在这种情况下,任何一种方法、基类或接口都同样适用,并且都是良好的 OO 实践。

于 2013-10-21T19:50:16.637 回答
1

另一种可能性是使用接口来保证只返回您的三种类型中的一种。

public IDomainList GetData(TableType type)
{
    switch (type)
    {
        case TableType.Person:
            return new Domain.PersonList(_personRepository.Get());
        case TableType.Event:
            return new Domain.EventList(_eventRepository.Get());
        case TableType.User:
            return new Domain.UserList(_userRepository.Get());
    }

    return null;
}

只要PersonListEventListUserList都实现了 IDomainList 接口,那么您就可以保证返回这三种类型。然后在您的实现中,您可以根据返回的特定类型确定要做什么。

于 2013-10-21T19:51:14.777 回答
0

这是返回值的参数化类型的通用解决方案的完整答案。

class Program
{
    public enum TableType
    {
        Person,
        Event,
        User
    }

    class Person
    {
        public string Name { get; set; }
        public Person(string name) { this.Name = name; }
    }
    class Event
    {
        public int EventType { get; set; }
        public Event(int eventType) { this.EventType = eventType; }
    }
    class User
    {
        public string UserName { get; set; }
        public User(string username) { this.UserName = username; }
    }

    public static T GetData<T>(TableType tableType)
    {
        switch (tableType)
        {
            case TableType.Person:
                Person person = new Person("John");
                return (T)Convert.ChangeType(person, typeof(T));
            case TableType.Event:
                Event evt = new Event(2);
                return (T)Convert.ChangeType(evt, typeof(T));
            case TableType.User:
                User user = new User("jjesus");
                return (T)Convert.ChangeType(user, typeof(T));
        }
        return default(T);
    }

    static void Main(string[] args)
    {
        Person person = GetData<Person>(TableType.Person);
        Console.WriteLine("Person.Name {0}", person.Name);

        Console.WriteLine("Hit any key to continue");
        Console.ReadKey();
    }
}
于 2013-10-21T20:03:16.503 回答
0

您可以创建三个GetData函数,将类型作为参数并返回正确的类型。

public List<TableType.Person> GetData(TableType.Person type)
{
    return new Domain.PersonList(_personRepository.Get());
}

public List<TableType.Event> GetData(TableType.Event type)
{
     return new Domain.EventList(_eventRepository.Get());
}

public List<TableType.User> GetData(TableType.User type)
{
     return new Domain.UserList(_userRepository.Get());
}

运行时将根据参数的类型选择正确的重载。

编辑:我假设 Domain.xxxxList 函数返回本示例中提到的类型的列表。当然,这不是必需的。

于 2013-10-21T19:49:31.800 回答