如何为泛型类方法获取正确的扩展方法?

纳文·查克拉瓦西(Naveen Chakravarthy)

我最近在编写代码时遇到了这个问题。有没有一种方法可以在基类中编写代码,以便它根据类型识别正确的扩展方法?

namespace GenericsInheritance
{
    public class Animal { }

    public class Dinasaur : Animal { }

    public class Dragon : Animal { }

    public abstract class Zoo<T> where T : Animal
    {
        public virtual string IdentifyYourSelf(T record)
        {
            //Calling extension method
            string name = record.IdentifyYourSelf();
            return name;
        }
    }

    public class DinasaurZoo : Zoo<Dinasaur> 
    {
        //I could use this, just wanted to try if base class method does identify the correct extension method for the type.
        //public override string IdentifyYourSelf(Dinasaur record)
        //{
        //    return record.IdentifyYourSelf();
        //}
    }

    public class DragonZoo : Zoo<Dragon> { }

    public class AnimalZoo : Zoo<Animal> { }

    //Extensions methods class.
    public static class LieDetector
    {
        public static string IdentifyYourSelf(this Animal record) { return "Animal"; }

        public static string IdentifyYourSelf(this Dinasaur record) { return "Dinasaur"; }

        public static string IdentifyYourSelf(this Dragon dog) { return "Dragon"; }

        //It works if I use this.
        //public static string IdentifyYourSelf<T>(this T record) where T : Animal
        //{            
        //    if (record is Dinasaur) { var dinasaur = record as Dinasaur; return IdentifyYourSelf(dinasaur); }
        //    else if (record is Dragon) { var dragon = record as Dragon; return IdentifyYourSelf(dragon); }        
        //    else return "I do not exist";
        //}
    }

    public class FbiInterrogation
    {
        public static void Main(string[] args)
        {
            var animal = new Animal();
            var dinasaur = new Dinasaur();
            var dragon = new Dragon();
            var dinasaurZoo = new DinasaurZoo();
            var dragonZoo = new DragonZoo();
            var animalZoo = new AnimalZoo();

            string name = dinasaurZoo.IdentifyYourSelf(dinasaur); //Prints Animal expecting Dinasaur
            name = dragonZoo.IdentifyYourSelf(dragon); //Prints Animal expecting Dragon
            name = animalZoo.IdentifyYourSelf(animal); //Prints Animal

            Console.ReadKey();
        }
    }
}
雾气

扩展方法根据调用它们的变量的静态类型而不是运行时类型来解析。因此,您问题的答案为“否”-您必须通过派生类中的重写或通过麻烦的类型检查(如您在问题中所指出的那样)来完成。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

C#在方法调用中扩展泛型类

来自分类Dev

泛型方法从超类获取参数类型

来自分类Dev

如何在扩展方法中获取“ this”参数的泛型类型参数?

来自分类Dev

如何从泛型类访问父类中的方法?

来自分类Dev

泛型-方法返回类型作为扩展类

来自分类Dev

扩展泛型类的类的错误覆盖方法

来自分类Dev

泛型与扩展方法

来自分类Dev

如何从泛型方法参数中获取Java类?

来自分类Dev

如何在泛型方法中获取泛型类型的类实例

来自分类Dev

如何为泛型类指定泛型集合类型?

来自分类Dev

如何为许多类添加扩展方法?

来自分类Dev

如何为类编写“获取”方法模板

来自分类Dev

如何为方法链接的泛型类型获取TRTTIType

来自分类Dev

从非泛型静态类中的泛型重载方法获取RuntimeMethodInfo

来自分类Dev

C#在方法调用中扩展泛型类

来自分类Dev

如何为“ Where”扩展方法获取正确的MethodInfo

来自分类Dev

如何从方法返回泛型类?

来自分类Dev

如何在扩展方法中获取“ this”参数的泛型类型参数?

来自分类Dev

泛型类型的扩展方法

来自分类Dev

泛型类型与扩展方法

来自分类Dev

一个泛型类使用expression <T,bool>方法创建泛型扩展

来自分类Dev

如何通过非泛型的子类从父类正确访问泛型方法?

来自分类Dev

如何正确创建在Java中扩展泛型接口的有界泛型类

来自分类Dev

如何在扩展方法中使用泛型类型成员?

来自分类Dev

如何为在打字稿中扩展泛型类的类添加构造函数?

来自分类Dev

C#如何在方法中获取泛型类引用

来自分类Dev

如何为 Holder 正确使用泛型

来自分类Dev

如何将泛型类扩展为泛型

来自分类Dev

泛型方法 T 扩展

Related 相关文章

热门标签

归档