使用Typeof在循环中进行转换

时间:2016-11-09 17:11:49

标签: c# wpf casting

我在数组中存储了我作为参数传递的2个对象的类型。 我试图将它们投入循环但它似乎不起作用。
我注意到当我调试对象的Type的值(由key.GetType()返回)时,它显示<h1>Hello<span style="font-size:80px;">WORLD</span> @media (max-width: 768px) { h1 { font-size: 180% !important; } } 而不是预期的Name=RunTimeType FullName=System.RuntimeType
我不确定我做错了什么。有什么建议吗?

Name=Label

2 个答案:

答案 0 :(得分:3)

您可以使用is运算符直接检查每个对象的类型:

public static void GetUserGUIDandSID(string username, object b, object c)
{
    ...

    foreach (var o in new object[] { b, c })
    {
        if (o is Label)
        {
            ((Label)o).FontSize = 10;
            ((Label)o).Content = empIdNum;
        }
        else if (o is TextBox)
        {
            ((TextBox)o).FontSize = 10;
            ((TextBox)o).Text = empIdNum.ToString();
        }
        else if (o is TextBlock)
        {
            ((TextBlock)o).FontSize = 10;
            ((TextBlock)o).Text = empIdNum.ToString();
        }
    }
}

此外,您可以通过声明params object[]参数使方法接受任意数量的对象:

public static void GetUserGUIDandSID(string username, params object[] objects)
{
    ...

    foreach (var o in objects)
    {
        ...
    }
}

现在,您可以使用不同的对象参数来调用它,例如

GetUserGUIDandSID("user", a);
GetUserGUIDandSID("user", a, b);
GetUserGUIDandSID("user", a, b, c);

答案 1 :(得分:1)

认为你想要这样做

List<object> types = new List<object>();
types.Add(b);
types.Add(c);

foreach (var key in types)
{
    if (key is Label)
    {
        ((Label)key).FontSize = 10;
        ((Label)key).Content = empIdNum;
    }
    if (key is TextBox)
    {
        ((TextBox)key).FontSize = 10;
        ((TextBox)key).Text = empIdNum.ToString();
    }
    if (key is TextBlock)
    {
        ((TextBlock)key).FontSize = 10;
        ((TextBlock)key).Text = empIdNum.ToString();
    }
}

对于OP:

为什么我这样做了 if (key.GetType() == typeof(Label)) 对此 if (key is Label)

在第一种情况下,我们正在检查Label类型。我的意思是,如果key是class的实例,派生自Label - 第一种情况将是假的。

例如,我们有自定义类:

public class MyAwesomeLabel : Label
{
}

以下代码

var myLabel = new MyAwesomeLabel();
Console.WriteLine(myLabel.GetType() == typeof(Label));
Console.WriteLine(myLabel is Label);

第一个案例会写False,第二个案例会写True。 在这种情况下,运算符is不会检查类型是否相等。它检查将给定实例强制转换为目标类型的可能性。更多信息https://msdn.microsoft.com/en-us/library/scekt9xw.aspx

从我的角度来看,在某些情况下is更好。