在非泛型接口中声明Generic方法

时间:2014-06-01 05:57:06

标签: c# c#-4.0 generics interface

请考虑以下代码:

public interface ImyInterface
{
    T GetEntity<T>(T t,int MasterID);
}

我声明了一个类名:MyEntity,它有一个名为A_1的属性

public class BL_Temp : ImyInterface
{
    public MyEntity GetEntity<MyEntity>(MyEntity t, int MasterID)
    {
        t.A_1 = ""; //Error
        return t;
    }
}

错误是:

  

'MyEntity'不包含'A_1'的定义,并且没有可以找到接受类型'MyEntity'的第一个参数的扩展方法'A_1'(你是否缺少using指令或汇编引用?)

是否可以在非泛型接口中声明泛型方法?

我的错误在哪里?

感谢


EDIT1)

考虑MyEntity声明是:

public class MyEntity
{
    public string A_1 {set; get;}
}

2 个答案:

答案 0 :(得分:11)

您可以声明,但您的方法将是通用的,而不是特定类型。我的意思是MyEntity是通用参数,它不是您的实体类型。

您可以像这样向您的实体添加约束,这样您就可以访问Entity个特定成员..

public interface ImyInterface
{
    T GetEntity<T>(T t,int MasterID) where T : Entity;
}    

public class BL_Temp : ImyInterface
{
    public T GetEntity<T>(T t, int MasterID) where T : Entity
    {
        t.MyEntityProperty = "";
        return t;
    }
}

我知道这是一个示例代码,但我觉得值得一提的是你的方法不应该是。方法名称是GetEntity,但它会改变客户端可能不知道的参数(我说它撒了谎)。 IMO你应该至少重命名方法或不要改变参数。

答案 1 :(得分:1)

即使您拥有课程MyEntity,也请参阅此代码

public MyEntity GetEntity<MyEntity>(MyEntity t, int MasterID)

MyEntity被视为通用参数。看起来你想要实现通用专业化。如果是这样,请阅读:How to do template specialization in C#