指向我在C#中选择的变量

时间:2014-12-21 10:22:19

标签: c#

我试图执行以下操作:

bool Has_Unique_Index<T>(Indexed<T> obj)
{
    byte type = Verify_Type<T>(obj);
    List<Indexed<T>> list;

    switch (type)
    {
        case 0: list = DataSource.Clients; break;
        case 1: list = DataSource.Rentals; break;
        case 2: list = DataSource.Cars;    break;
        case 3: list = DataSource.Faults;  break;
    }

    foreach (var i in list)
    {
        if (i.Index == obj.Index)
            return false;
    }

    return true;
}

(无法弄清楚如何使用没有它们的三角括号消失在HTML空白中):

然而,编译器告诉我它不能将任何DataSource.x转换为List(Indexed(T))类型。

Verify_Type(T)(obj)确保T是交换机中的4个选项之一,因此List(Indexed(T))应该没问题 - 除了它不是指针或任何类型的东西

  • 如何使用switch语句(或任何其他方法)在C#中指向我选择的变量?

编辑:DataSource.x的类型为List(Indexed(T))。

EDIT2:正如人们所指出的,我实际上意味着源是List(索引(SOMECONCRETETYPE))。

4 个答案:

答案 0 :(得分:2)

您可以通过(List<Index<T>>)显式转换为Jan Zahradník来解决编译错误。

case 0: list = (List<Index<T>>)DataSource.Clients.ToList(); break;

或简化方法:

bool Has_Unique_Index<T>(Indexed<T> obj)
{
    byte type = Verify_Type<T>(obj);

    switch (type)
    {
        case 0: return !DataSource.Clients.Any(r=> r.Index == obj.Index); break;
        case 1: return !DataSource.Rentals.Any(r=> r.Index == obj.Index); break;
        case 2: return !DataSource.Cars.Any(r=> r.Index == obj.Index);    break;
        case 3: return !DataSource.Faults.Any(r=> r.Index == obj.Index);  break;
    }

    throw new Exception("unknown type: " + type);
}

答案 1 :(得分:1)

由于T是通用类型,我猜您不会拥有List<Indexed<T>>类型的DataSource.Cars,而是List<Indexed<Car>>。在T例如是T的情况下,当然不能将其转换为T.客户。让我们尝试向List<Indexed<T>>添加显式强制转换为每个列表分配。

答案 2 :(得分:1)

您需要强制转换属性。我只做过一次:

bool Has_Unique_Index<T>(Indexed<T> obj)
{
    byte type = Verify_Type<T>(obj);
    object dataSource = null;

    switch (type)
    {
        case 0: dataSource = DataSource.Clients; break;
        case 1: dataSource = DataSource.Rentals; break;
        case 2: dataSource = DataSource.Cars;    break;
        case 3: dataSource = DataSource.Faults;  break;
        default: return false; // or throw an exception etc.
    }

    bool result = (dataSource as List<Indexed<T>>).Any(x => x.Index == obj.Index);
    return result;
}

答案 3 :(得分:1)

编译失败的原因与您在问题中的编辑稍有不正确的原因相同。您声明DataSource.x个对象的类型为List<Indexed<T>>,但实际上它们的类型为List<Indexed<SOMECONCRETETYPE>>

编译失败,因为至少有三个DataSource.x对象 类型T(即它们不是通用的;他们有不同的基础类型,这已经具体了。)

你可以“投射”#39;到List<Indexed<T>>

bool Has_Unique_Index<T>(Indexed<T> obj)
{
    List<Indexed<T>> list == null;

    switch (Verify_Type<T>(obj))
    {
        case 0: list = DataSource.Clients as List<Indexed<T>>; break;
        case 1: list = DataSource.Rentals as List<Indexed<T>>; break;
        case 2: list = DataSource.Cars as List<Indexed<T>>;    break;
        case 3: list = DataSource.Faults as List<Indexed<T>>;  break;
    }

MSDN:&#34; as运算符就像一个强制转换操作。但是,如果转换不可能,则返回null而不是引发异常。&#34;

如果list为null(类型超出范围或as返回null),则抛出:

    if (list == null)
         throw SomeException();

我们可以使用IEnumerable.All代替foreach循环:

    return list.All(i => i.Index != obj.Index);
}

当然,您可以在Jesse James&#39;中选择较短的代码。回答完全避免了演员/转换。