访问实现的类方法而不通过Interface创建对象?

时间:2015-07-29 11:27:48

标签: c# .net interface

我有两个类Say A和B,它有方法set()。

   public Class A : I<string>
   {
      void Set(string str)
      {
         //do something
      }
   }

   public Class B : I<int>
   {
      void Set(int str)
      {
         //do something
      }
   }

接口如下......

interface I<T>
{
    void Set(T param);
}

我想在没有通过接口实例化类的情况下访问此方法(可能还是有其他方式,如依赖注入?)。

来自另一个班级

Class D
{
    I.Set(<T> str); //something like this
}

所以基于数据类型我需要从任一接口或某些地方重定向调用,所以如果明天我添加了一个实现相同接口的C类,我不应该在D中更改代码。

提前致谢...

2 个答案:

答案 0 :(得分:4)

接口有点像实现类提供的方法模板。你不能做任何事情&#34;有一个界面。您始终需要实现该接口的类的实例。

所以你想要的东西不起作用。但是,一个简单的扩展方法将帮助您:

public static class MyExtensionMethods
{
    public static void SetValue<T>(this I<T> intf, T value)
    {
        intf.Set(value);
    }
}

使用此功能,您可以写:

A a = new A();
B b = new B();

b.SetValue("Hello");
a.SetValue(1);

它可以用于实现I<T> 的任何其他类,而无需更改扩展方法

public class D : I<double>
{
    public void Set(double d) { ... }
}

D d = new D();
d.SetValue(42.0);

答案 1 :(得分:0)

您需要传递某些内容,所以此刻,我最好的猜测是

class D
{
  public void Set<T>(object target, T value) 
  {
    var instance = target as I<T>;
    if (instance != null)
    {
      instance.Set(value);
    }
  }
}

叫做:

var theD = new D();
var theA = new A();
var theB = new B();
theD.Set<string>(theA, "hello");
theD.Set<int>(theB, 1);