C#中Letamethodtakeanydatatype我有很多单元测试,几乎测试相同的行为。但是,数据类型发生了变化,我正在尝试创建一个可以采用任何数据类型的通用方法。我尝试使输入参数为var,但这是不允许的。另外,请查看c#generics,但它通常处理列表。您可以将参数设为一个对象:publicvoidDoSomething(objectarg){//...两个主要优点,我将说明它们为何有用:即使您没有明确指定arg的类型,您仍然可以访问它。您可以对要允许的类型添加约束。相比之下,对象方法有一些重要的缺点:由于将arg视为对象,因此只能对任何对象执行操作。如果将值类型作为对象参数传递,变量将被装箱,这意味着性能会受到影响。这不是一个巨大的打击,但如果您连续多次调用DoSomething,您可能会开始感觉到它。泛型和类型约束向泛型方法添加类型约束允许您将方法限制为仅接受某些类型。为什么这行得通?因为即使您不知道或不关心您正在使用的特定类型,您现在也知道一些关于它的信息,并且您可以使用该信息。考虑以下设置:publicinterfaceIAnimal{voidMove();}publicclassDuck:IAnimal{publicvoidMove(){Console.WriteLine("Flying");}}publicclassFish:IAnimal{publicvoidMove(){Console.WriteLine("游泳");}}publicclassAnt:IAnimal{publicvoidMove(){Console.WriteLine("Walking");由于我们有一个IAnimal接口,我们可以编写针对IAnimal方法的任何实现的泛型:}publicstaticvoidMain(string[]args){Duckduck=newDuck();鱼鱼=newFish();蚂蚁蚂蚁=新蚂蚁();DoMove(鸭子);做移动(鱼);做移动(蚂蚁);参数动物是鸭子、鱼、蚂蚁或其他任何东西。我们只关心调用animal.Move()。由于我们使用whereT:IAnimal约束,编译器知道我们需要它知道的一切:可变动物的类型为T。无论T是什么,它都实现了IAnimal。任何实现IAnimal的东西都有一个Move()方法。因此,我们可以安全地调用animal.Move()。(顺便说一下,是的,我们可以将DoMove写成staticvoidDoMove(IAnimalanimal),但那是另一个讨论。)类型推断(及其一些含义)很好,但让我们更进一步。在许多情况下,您可以在不指定其类型参数的情况下调用泛型方法。这称为类型推断,除了为您节省一些输入之外,它在对不同类型的对象执行相同操作时也很有用。publicstaticvoidMain(string[]args){IAnimal[]animals=newIAnimal[]{newDuck(),newFish(),newAnt()};foreach(动物中的IAnimal动物){DoMove(animal);}}运行它:http://rextester.com/OVKIA12317您只需要编写一次DoMove方法,就可以在任何类型的IAnimal上调用它而无需提供更具体的类型。每次调用相应的Move版本,因为DoMove能够推断出哪种类型用于T当您调用DoMove(duck)时,.NET理解您真正的意思是DoMove(duck)并调用Duck类的Move方法。您可以将对象作为参数类型。也许更好的方法是使用泛型:voidMyMethod(Tparm){...}这样,参数实际上就是用户传入的类型——它不像对象和值类型那样装箱。voidMyTestMethod(Tt){}给了你一个通用的测试方法,但我想不出任何有用的方法。你需要测试什么?你怎么知道T-type有这些方法?T可以是上述方法中的任何类型。在上面的示例中,您可以从t调用的唯一方法是对象的常用方法。您真正需要做的是确定要测试的一个或多个类型的常见行为,并通过接口为该行为定义语法契约。然后,您可以将通用测试方法限制为仅接受实现该接口的类型。接口IMyInterface{voidDoSomething();}voidMyTestMethod(Tt)whereT:IMyInterface{t.DoSomething();}publicvoidYourMethod(Tparameter){}尝试使用动态关键字,只要你所有的不同类型都有unit测试使用的相同方法,这会起作用,否则你会得到运行时异常以上是C#学习教程:让方法在c#中取任意数据类型,如果对大家有用,需要了解的就全部分享给大家关于C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
