C# 如何将这两种类型中的任何一种作为C中方法的参数#

C# 如何将这两种类型中的任何一种作为C中方法的参数#,c#,generics,C#,Generics,我有两个名称相同、结构相同但来自不同命名空间的类。比如说, class A { int a; double b; void func() { //something } } 现在我有了一个从一个名称空间与对象交互的方法 void operation(xyz.A a) { // perform some operation } 我还想对其他对象重用相同的代码(来自不同的名称空间) 我该怎么做 我尝试过使用泛型来实现这个目的,但失败了。 这是我试过的 void o

我有两个名称相同、结构相同但来自不同命名空间的类。比如说,

class A
{
  int a;
  double b;
  void func()
  {
    //something
  }
}
现在我有了一个从一个名称空间与对象交互的方法

void operation(xyz.A a)
{
  // perform some operation
}
我还想对其他对象重用相同的代码(来自不同的名称空间)

我该怎么做

我尝试过使用泛型来实现这个目的,但失败了。 这是我试过的

void operation<T>(T a)
{
  a.func();//error
  // perform some operation
}
void操作(ta)
{
a、 func();//错误
//做些手术
}

我收到的错误消息是T不包含“func”的定义,并且找不到接受类型为“T”的第一个参数的可访问扩展方法“func”(您是否缺少using指令或程序集引用?

最好的方法是拥有一个公共接口,如注释中所述。有一些方法可以通过反射使用成员的名称来调用成员。但我不建议这样做。当某些内容发生更改时,这并不是真正的保存,而且-我不确定-没有必要使用performa但不管怎样,这里有一个例子,即使使用了参数。它给你一个印象,它是什么样子的

答案1

无论如何,以下是接口示例:

using BaseNamespaceAbcAndXyzSee;

namespace abc
{
    class A : IA

    {
        public void Foo() { }
    }
}

namespace xyz
{
    class A : IA
    {
        public void Foo() { }
    }
}

namespace BaseNamespaceAbcAndXyzSee
{
    interface IA
    {
        void Foo();
    }
}
然后你可以这样称呼它:

  static void ExecuteFoo(IA aClass)
  {
      aClass.Foo();
  }
答案2(动态)

您还可以使函数a选择“类型”动态。这使您更容易在不知道类型的情况下执行函数。但作为反射方法,它不会保存为更改。当您写入错误的内容时,它将引发异常:

static void Main(string[] args)
    {
        var a = new abc.A();
        ExecuteFoo(a);
        Console.ReadLine();
    }

    static void ExecuteFoo(dynamic aClass)
    {
        aClass.Foo();
        aClass.Bar(); //-> Exception
    }

最好的方法是拥有一个公共接口,正如评论中提到的。有一些方法可以通过反射来使用成员的名字来调用成员。但我不建议这样做。当某些内容发生变化时,这并不是真正的保存,而且-我不确定这一点-不需要性能。但无论如何,这里有一个方法,即使使用了参数。它让你对它有个印象

答案1

无论如何,以下是接口示例:

using BaseNamespaceAbcAndXyzSee;

namespace abc
{
    class A : IA

    {
        public void Foo() { }
    }
}

namespace xyz
{
    class A : IA
    {
        public void Foo() { }
    }
}

namespace BaseNamespaceAbcAndXyzSee
{
    interface IA
    {
        void Foo();
    }
}
然后你可以这样称呼它:

  static void ExecuteFoo(IA aClass)
  {
      aClass.Foo();
  }
答案2(动态)

您还可以使函数a选择“类型”动态。这使您更容易在不知道类型的情况下执行函数。但作为反射方法,它不会保存为更改。当您写入错误的内容时,它将引发异常:

static void Main(string[] args)
    {
        var a = new abc.A();
        ExecuteFoo(a);
        Console.ReadLine();
    }

    static void ExecuteFoo(dynamic aClass)
    {
        aClass.Foo();
        aClass.Bar(); //-> Exception
    }

这两个类都实现了一个公共接口吗?如果没有,您是否控制这些类,并可以使它们实现一个公共接口?正如@ZoharPeled所述,除非您可以使这两个类实现同一个接口,否则您不能这样做。或者,您可以使您的
操作
方法接受
动态
input对象,但是您正在抛弃所有类型安全性,这违背了使用C#的目的。不幸的是,这些类没有实现公共接口,我也不能让它们实现。@ZoharPeledUse
dynamic
作为参数类型。或者您可以使用
object
type和downcasting-inside方法。这些类都实现了吗输入公共接口?如果没有,您是否控制这些类,并可以使它们实现公共接口?正如@ZoharPeled所述,除非您可以使两个类实现相同的接口,否则您无法执行此操作。或者,您可以使您的
操作
方法接受一个
动态
输入对象,但您不能hr取消了所有类型安全性,这违背了使用C#的目的。不幸的是,这些类没有实现公共接口,我也不能让它们实现。@ZoharPeledUse
dynamic
作为参数类型。或者你可以使用
object
type和downcasting inside方法。谢谢@Malior,但我不能让这些类实现修改任何接口。@HarshRaj,在这种情况下,您只能进行反射变化,或使用dynamic关键字。我更新了对此的答案。谢谢@malior,使用dynamic关键字可以帮助我解决此问题谢谢@malior,但我无法使这些类实现任何接口。@HarshRaj,在这种情况下,您只能进行反射我更新了这个问题的答案。谢谢@malior,使用动态关键字帮助我解决了这个问题