c# - 关于泛型、继承和链接的棘手问题

标签 c# generics inheritance lambda

上下文 - read this .

问题:

 class Program
    {
        static void Main()
        {
            var b = new bar();

            b.buzz().fizz().buzz().fizz(); //cool
            //              ^FAIL!!!...<------------------------------------
            Console.ReadLine();
        }
    }

    public class foo
    {
        public foo fizz() { return this; }
    }

    public class bar : foo
    {
        public bar buzz()
        {
            return this;
        }
    }

解决方法:

 class Program
    {
        static void Main()
        {
            var b = new bar();

            b.buzz().fizz().buzz().fizz(); //cool stuff
            Console.ReadKey();
        }
    }

    public static class fooExtensions
    {
        public static T fizz<T>(this T t) where T : foo
        { return t; } 
    }

    public class foo{}

    public class bar : foo
    {
        public bar buzz()
        {
            return this;
        }
    }

这是一种如何“模仿”能够返回派生类型的基类方法的技术(否则我的 b 无法再次调用 buzz())。

更进一步,使 foo/bar 通用(这仍然可以正常工作):

  class Program
    {
        static void Main()
        {
            var b = new bar<buzz>();

            b.buzz().fizz().buzz().fizz(); //cool
            Console.ReadLine();
        }
    }

    public static class fooExtensions
    {
        public static T fizz<T>(this T t) where T : foo<buzz>
        { return t; }
    }

    public class buzz { public string name { get; set;} }

    public class foo<T> where T : buzz
    {}

    public class bar<T> : foo<T> where T : buzz
    {
        public bar<T> buzz()
        {
            return this;
        }
    }

问题是-
如何将 lambda 传递给 fizz知道 tbuzz 的方法并且它的属性没有显式传递类型参数

可能反射(reflect)我正在寻找的内容的损坏代码:

class Program
    {
        static void Main()
        {
            var b = new bar<buzz>();

            b.buzz().fizz(x=>x.name).buzz().fizz(); //not cool anymore
            //               ^FAIL!!!<---------------------------------
            Console.ReadLine();
        }
    }

    public static class fooExtensions
    {
        //NO IDEAS WHAT TO WRITE BELOW!!!
        public static T fizz<T, Tbuzz>(this T t, 
            Func<Tbuzz, object> superlambda)
            where T : foo<buzz>
            where Tbuzz : buzz 
        {
            return t;
        }
    }

    public class buzz { public string name { get; set;} }

    public class foo<T> where T : buzz
    {}

    public class bar<T> : foo<T> where T : buzz
    {
        public bar<T> buzz()
        {
            return this;
        }
    }

想知道这是否可能。如果不是——为什么?

理论上 - foo<T>知道有一个 buzz下。

有没有其他方法可以创建或模拟支持此类类链接的基方法?

最佳答案

我不认为你想要完成的是可能的。从理论上讲,您需要的是某种约束,例如:

where TBuzz : T<inner> 

意味着 TBuzz 必须是 T 的内部泛型类型。据我所知,这是不可能的。

关于c# - 关于泛型、继承和链接的棘手问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1604382/

相关文章:

c++ - 复制引用对象并调用虚方法 C++

C++:模板化继承递归类:不可能的三重威胁?

c# - 如何获取 UTF-16 字节数组?

c# - 创建用户控件时是否应该尝试遵循 MVVM

swift - 访问类实异常(exception)部的泛型类类型

c# - 多个 LINQ 表达式和动态属性

Ruby:选择性类继承?

C# 线程在关闭文件时挂起

c# - 在 C# 中设置用于保存文件的默认文件夹

generics - 语法 : multiple generic constraints and inheritance, 接口(interface)