我在数组中存储了我作为参数传递的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
答案 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
更好。