簡體   English   中英

如何改善延伸方式

[英]How do I improve my extension method

我編寫了一個擴展方法,該方法根據作為索引器傳遞給函數的Type來查找控件。 這是我的擴展方法。

public static T FindControlByType<T>(this Control childCnt, string Id = "")
    {
        foreach (Control item in childCnt.Controls)
        {
            if (item is T)
            {
                if (Id == "")
                {
                    return (T)Convert.ChangeType(item, typeof(T));
                }
                if (item.ID.Contains(Id))
                {
                    return (T)Convert.ChangeType(item, typeof(T));
                }
            }
        }

        //return T 

    }

我想返回Type T的控件。我該如何實現?

如果添加通用約束以將T限制為Control類型,則不需要ChangeType調用。 演員陣容就足夠了。

public static T FindControlByType<T>(this Control childCnt, string id = "") 
    where T : Control
{ 
    foreach (Control item in childCnt.Controls) 
    { 
        if (item is T && ((id == "" || item.ID.Contains(id)))
        { 
            return (T)item; 
        } 
    } 

    return default(T);

} 

我發現的一件事是不需要

 if (Id == "")                 
  {                     
       return (T)Convert.ChangeType(item, typeof(T));                 
  } 

因為Asp.net中的每個控件都必須具有ID。

你為什么不嘗試如下的linq的oftype方法....(這只是建議)

var checkBoxes = this.GetAllControls().OfType<CheckBox>(); 

如果您已經驗證了is T的值,我不確定為什么要轉換該值。

這應該等效:

public static T FindControlByType<T>(this Control childCnt, string Id = "")
     where T: Control
{
    return childCnt.Controls.OfType<T>()
                   .FirstOrDefault(item => string.IsNullOrEmpty(Id) || item.ID.Contains(Id));

}

我認為這應該足夠了:

public static T FindControlByType<T>(this Control child, string id="") where T: Control
{
    return child.Controls.OfType<T>().FirstOrDefault(x => x.ID.Contains(id));    
}

順便說一句,您確定要使用x.ID.Contains(id)嗎? 為什么?

如果ID="indians"id="indian" ,則ID.Contains(id)將返回true ,即使IDid不相同。 如果它們不相同,那么比較它們並假裝它們相同又有什么意義呢?

我認為您應該使用x.ID.Equals(id)

return child.Controls.OfType<T>().FirstOrDefault(x => x.ID.Equals(id));  

如果此方法確實是按類型而不是ID *查找子Control的方法,則可以考慮返回IEnumerable<T>而不是T 然后可以使用Linq輕松實現該方法:

public static IEnumerable<T> FindControlsByType<T>(this Control childCnt, string Id = "")
    where T : Control
{
    var controls = childCnt.Controls.OfType<T>();

    return Id == "" ? controls : controls.Where(c => c.ID.Contains(Id));
}

另外,正如其他人指出的那樣,為T類型參數添加類型約束。

*為此, FindControl方法可能已滿足您的需求? 但是請注意,這將搜索確切的ID而不是子字符串。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM