public interface IData { string DataName { get; set; } } public class TextBox : System.Windows.Forms.TextBox, IData { public string DataName { get; set; } } public static class Ext { public static TResult Find<TResult>(this Control.ControlCollection @this, string filedName) where TResult : Control, IData { TResult result = default(TResult); foreach (var control in @this) { IData iData = control as IData; if (null == iData) continue; if (iData.FieldName == filedName) { result = control as TResult; break; } } return result; } }
异常调用:IData iData = this.Find<IData>("Name");
错误: 不能将类型“ClassLibrary.Controls.IData”用作泛型类型或方法“ClassLibrary.Controls.Ext.Find<TResult>(System.Windows.Forms.Control.ControlCollection, string)”中的类型形参“TResult”。没有从“ClassLibrary.Controls.IData”到“System.Windows.Forms.Control”的隐式引用转换。
Control.ControlCollection 中存放的是 System.Windows.Forms.Control 类型,System.Windows.Forms.Control 同你的 IData 类型没有任何关系,因此转换不成立。
那我如何解决这个问题?
建立一个接口 IControl:Control,IData
where TResult:IControl
@Me_Code: 你看下抛出异常时, IData iData = control as IData 中的 control 的实际类型是什么?
@Launcher: 编译时就会异常。
@Me_Code:
abstract class IData;
static TResult Find<TResult>(this Control.ControlCollection @this, string filedName)
where TResult : class, IData
我只能这么给你改,不保证类型安全。
@Launcher: 感谢指导。