2016-11-09 60 views
2

我在數組中存儲了作爲參數傳遞的2個對象的類型。 我試圖在循環中投射它們,但它似乎不起作用。
我注意到當我調試對象的類型的值(由key.GetType()返回)時,它顯示Name=RunTimeType FullName=System.RuntimeType而不是預期的Name=Label
我不知道我在做什麼錯。有什麼建議麼?使用Typeof在循環中鑄造

public static void GetUserGUIDandSID(string username, Object b, Object c) { 
     PrincipalContext ctx = new PrincipalContext(ContextType.Domain, 
     "domainName.com"); 
     UserPrincipal user = (UserPrincipal.FindByIdentity(ctx, username)); 
     var empIdNum = user.Guid.Value; 
     var empSID = user.Sid.Value; 

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

     foreach(var key in types) { 
      if (key.GetType() == typeof(Label)) { 
       ((Label)b).FontSize = 10; 
       ((Label)b).Content = empIdNum; 
      } 
      if (key.GetType() == typeof(TextBox)) { 
       ((TextBox)b).FontSize = 10; 
       ((TextBox)b).Text = empIdNum.ToString(); 
      } 
      if (key.GetType() == typeof(TextBlock)) { 
       ((TextBlock)b).FontSize = 10; 
       ((TextBlock)b).Text = empIdNum.ToString(); 
      } 
     } 
    } 
+0

你可以做「b是標籤」,「c是標籤」 – Steve

+0

你能告訴我們你怎樣稱呼你自己的功能?我懷疑你傳遞的是對象的類型而不是它們的實例,如[這裏顯示](http://stackoverflow.com/a/5737947/4905310)。就像調用'GetUserGUIDandSID(「user1」,tb1.GetType(),lb1)。「GetType());'而不是'GetUserGUIDandSID(」user1「,tb1,lb1);' –

回答

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); 
+0

我注意到了,但後來我看到,內部循環OP試圖爲每種類型投出'''b''' :) – tym32167

+0

嗨Clamens thx洞察foreach(var o在新對象[] {b,c}),使我的代碼更短:)我的typeoff()的問題是if語句中添加的GetType(),'是'運算符正在做的工作很好,thx再次 – wavestone

+0

Clamens,請你詳細說明如何使用'params'來接受任意數量的對象bu的方法,這樣我就可以推廣在許多事件中使用的函數,讓我們說有一次,我想通過10種不同類型的控制,其他時間只有3等... – wavestone

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:

爲什麼我cnahged這個 if (key.GetType() == typeof(Label)) 這個 if (key is Label)

在第一種情況下,我們正在檢查究竟Label類型。我的意思是,如果關鍵將是從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更好。

+0

嗨Tym,是的,這正是我想要做的:)順便說一句,'is'和'typeoff'之間的區別是什麼情況下,他們都達到了相同的結果?我讓我的代碼與他們的每一個工作,所以我想知道哪一個更好 – wavestone

+0

@wavestone更新回答 – tym32167