【问题标题】:Code generator to make inline abstract classes that fulfill the role of java anonymous inner classes for C# interfaces?代码生成器生成内联抽象类,以履行 C# 接口的 java 匿名内部类的角色?
【发布时间】:2010-11-08 09:39:25
【问题描述】:

注意:我知道 C# 有匿名类型和内部类型,但它们的作用与旧的 java 匿名内部类截然不同。

假设我有一个接口:

public interface Foo<T>
{
    int Fizz(string a);
    T Buzz(object o);
    void Crackle();
}

那里有什么东西(ReSharper 宏或类似的东西)可以让我生成一个实现类,该类将履行 java 样式 AIC 的角色(即,允许我定义内联功能)。即

public class FooAIC<T> : Foo<T>
{
    public Func<string, int> Fizz;
    public Func<object, T> Buzz;
    public Action Crackle;

    int Foo<T>.Fizz(string a)
    {
        return Fizz(a);
    }

    T Foo<T>.Buzz(object o)
    {
        return Buzz(o);
    }

    void Foo<T>.Crackle()
    {
        Crackle();
    }
}

(我还没有详细考虑过这一点大量。所以我想可以创建一个更智能的类,其中包含只读成员注入、调用时的空值检查、适用于抽象类等,但这应该传达我想要实现的一般想法

有人知道可以做到这一点的东西吗?或者,除此之外,推荐最轻松的方式来做这样的事情——这在 T4 引擎中是否可行?

【问题讨论】:

    标签: c# macros anonymous-class


    【解决方案1】:

    您的解决方案没问题,通常在 .NET 中您不需要匿名类,因为大多数时候您只需在它们上覆盖/实现一个方法,并且为此您有委托(我认为这是一个更好的选择)。但是,如果您需要覆盖/实现多个方法,则为每个方法创建一个带有委托的存根类是最好的方法。在 WPF/Silverlight ICommand 中以这种方式实现,你有一个 DelegateCommand 类,它接收一个 Func 来实现 bool CanExecute(object parameter) 和一个 Action 来实现 Execute(object parameter)。在代码生成中最正确的方法是使用 T4 模板,在其中创建一个模板和一个参数(例如,一个指示要为其创建 Delegateclass 的类的类名的字符串,并使用反射来生成代码)。

    希望对我有所帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-18
      • 2014-12-22
      • 2014-11-26
      相关资源
      最近更新 更多