[英]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
,即使ID
和id
不相同。 如果它們不相同,那么比較它們並假裝它們相同又有什么意義呢?
我認為您應該使用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.