首页 新闻 会员 周边 捐助

C# 泛型限制

0
悬赏园豆:10 [已解决问题] 解决于 2015-06-30 14:03
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”的隐式引用转换。

Me_Code的主页 Me_Code | 初学一级 | 园豆:52
提问于:2015-06-30 12:37
< >
分享
最佳答案
0

Control.ControlCollection 中存放的是 System.Windows.Forms.Control 类型,System.Windows.Forms.Control 同你的 IData 类型没有任何关系,因此转换不成立。

收获园豆:10
Launcher | 高人七级 |园豆:45050 | 2015-06-30 13:03

那我如何解决这个问题?

建立一个接口 IControl:Control,IData

where TResult:IControl

Me_Code | 园豆:52 (初学一级) | 2015-06-30 13:23

@Me_Code: 你看下抛出异常时, IData iData = control as IData 中的 control 的实际类型是什么?

Launcher | 园豆:45050 (高人七级) | 2015-06-30 13:49

@Launcher: 编译时就会异常。

Me_Code | 园豆:52 (初学一级) | 2015-06-30 13:54

@Me_Code: 

abstract class IData;

static TResult Find<TResult>(this Control.ControlCollection @this, string filedName)
            where TResult : class, IData

我只能这么给你改,不保证类型安全。

Launcher | 园豆:45050 (高人七级) | 2015-06-30 13:59

@Launcher: 感谢指导。

Me_Code | 园豆:52 (初学一级) | 2015-06-30 14:03
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册