ReSharper实时模板可以做条件代码生成吗?

时间:2012-08-26 17:10:44

标签: resharper live-templates

示例:我想要一个插入方法的模板。如果该类声明为sealed,那么我希望将该方法声明为private。如果该课程不是sealed,那么我希望将该方法声明为protected virtual

另一个例子。如果该类是继承的,并且超类包含方法X,则调用base.X();否则不执行任何操作。

ReSharper中是否提供此类条件处理?我想这已经接近T4领域,但能够在实时模板中做到这一点真的很方便。

如果重要,我正在使用R#7。

详细方案

这两个要求来自于尝试为IDisposable模式编写实时模板(请参阅Implementing the Disposable Pattern Correctly)。生成的代码需要根据类是基类还是子类而不同。可以定义两个模板,但要想出其他有用的场景并不困难。这是我的IDisposable模板中的代码:

#region IDisposable Pattern
    /// <summary>
    ///   Finalizes this instance (called prior to garbage collection by the CLR)
    /// </summary>
    ~$ClassName$() {
    Dispose(fromUserCode: false);
    }

public void Dispose()
{
    Dispose(fromUserCode: true);
    GC.SuppressFinalize(this);
}

private bool disposed = false;

// Declare as private if this class is sealed.
protected virtual void Dispose(bool fromUserCode)
{
    if (!disposed)
    {
        if (fromUserCode)
        {
            // ToDo - Dispose managed resources (call Dispose() on any owned objects).
            // Do not dispose of any objects that may be referenced elsewhere.
        }

        // ToDo - Release unmanaged resources here, if necessary.
    }
    disposed = true;

    // ToDo: Call the base class's Dispose(Boolean) method, if available.
    // base.Dispose(fromUserCode);
}
#endregion

1 个答案:

答案 0 :(得分:3)

你当然可以这样做。你需要的是一个插件,它实现了执行实际检查的相应live template macro