0

假设我有两个接口,IFeaturesA,IFeaturesB。

IFeaturesA 有一组签名方法。假设一个是:-

public void printMe();

IFeaturesB 实现了 IFeaturesA,并增加了一个新的签名方法,例如:-

public void printMeAlso();

假设我想使用通用方法,例如:-

public Check<E>(E passedItem)
{

}

如果我传入 IFeaturesA,我希望能够调用此方法。如果我传入 IFeaturesB,我希望能够调用额外的方法 printMeAlso();

检查传递给泛型方法的接口类型并在 C# 中访问其方法的最佳方法是什么?是否针对两种接口类型检查对象类型,然后转换为最佳方式?

4

7 回答 7

4

那不适合泛型

泛型是对行为的无类型重用。如果您需要检查类型,那么它不适合泛型。您可以施加约束,但不能在泛型方法中检查实际类型。

您要抽象的只是您正在传递一个 item的事实。那不是抽象。

于 2012-04-18T11:31:42.063 回答
2

使用两种方法

公共检查(IFeaturesA passItem){

}

公共检查(IFeaturesB passItem){

}

添加私有方法来处理通用性

于 2012-04-18T11:36:57.380 回答
1

不要认为通过定义接口来实现你想要的东西是一个好方法,简单定义类结构,比如

public class FeaturesA
{
    public virtual void printMe()
    {  
    }

}

public class FeaturesB : FeaturesA
{
    public override void printMe()
    {  
    }

}

在代码中使用之后,比如

FeaturesA a = new FeaturesA(); 
FeaturesA b = FeaturesB();
public Check(A passedItem)
{
    passedItem.printMe();
}

Check(a) 印刷品a上,在Check(b)印刷品b上

希望这可以帮助。

于 2012-04-18T11:34:24.773 回答
1

如果要检查项目的类型,请使用“is”:

if (passedItem is IFeatureA) { }

如果您想将泛型限制为可以由接口或抽象类定义的某些行为,请使用“where”:

public class foo<E> where E : IFeatureA
{
}

后一种情况不允许您使用 IFeatureB,但类型 E 类中的任何变量都可以使用 IFeatureA 中定义的方法和属性,而无需检查类型。

您可能还想查看 Dynamic 类型,因为它更接近您想要做的事情。

于 2012-04-18T11:36:47.080 回答
0

我会检查 E 的类型

if(E.GetType().Equals(typeof(IFeaturesA)){ //call method...}
于 2012-04-18T11:31:55.100 回答
0

这看起来像是对另一个接口的调用。

如果你让两个接口都继承IPrintable其中只包含一个Print()方法,并扩展你的Check<E>(E passedItem)with where E : IPrintable,你可以调用passedItem.Print().

于 2012-04-18T11:34:41.703 回答
0

尝试以下

Check(IFeaturesA f) {}
Check(IFeaturesB f){}
Check<T>(T obj) where T : IFeaturesA, IFeaturesB {}
于 2012-04-18T11:34:52.063 回答