C#,WinForms和扩展方法

时间:2009-10-02 20:31:59

标签: c# .net-3.5 extension-methods

问题

除了所有明显的答案之外,什么会导致扩展方法产生像这样的编译器错误:

'DataType'不包含'YourExtensionMethodName'的定义

我在这里有一个真正的傻瓜,下面详细介绍了你。我已经筋疲力尽了所有可能的原因。

方案

  • 我在WinForms应用程序使用的DLL中的各种静态类中定义了几个扩展方法。
  • 扩展方法签名与我正在扩展的类的方法的签名不冲突(在这种情况下为String)。
  • DLL和WinForms应用程序都是用C#编写的。
  • DLL和WinForms应用程序都配置为以.NET 3.5为目标。
  • 使用类包括对定义扩展方法的命名空间的引用。它的拼写已经过验证。
  • 如果我直接引用扩展类,则会出现扩展方法。例如,如果我输入StringExtensions.,Intellisense将显示为正常,并列出我的所有扩展方法。
  • 编辑:错误发生在WinForms应用程序中,但仅适用于扩展方法的部分,而非所有

守则(或其摘录)

(是的,这是有问题的代码)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Roswell.Framework
{
    public static class StringBuilderExtensions
    {
        public static string ToSentenceCase(this string value)
        {
            return value.Substring(0, 1).ToUpper() + value.Substring(1).ToLower();
        }

        public static string ToTitleCase(this string value)
        {
            string[] parts = value.Split(new string[] {" "}, StringSplitOptions.None);
            System.Text.StringBuilder builder = new System.Text.StringBuilder();
            foreach (string part in parts)
            {

                builder.Append(part.ToSentenceCase());
                builder.Append(" ");
            }
            return builder.ToString();
        }

    }
}

这是消耗它的代码:

using Roswell.Framework;

namespace Roswell.Windows.Command
{
    /// <summary>
    /// Views the SQL for an object in the database window.
    /// </summary>
    internal class ViewObjectDdlCommand
        : MainWindowCommand
    {

        public override void Execute()
        {
           // ...

           OpenCodeWindow(
               string.Format("{0} - {1} - {2}", 
                             dsn.Name, 
                             objectName, 
                             info.ToTitleCase()),
                schemaItemType,
                objectName);
         }
    }
}

2 个答案:

答案 0 :(得分:4)

在您的代码段中,我可以看到您在名为ToTitleCase的内容上呼叫info。但是我看不到那个变量的类型,这将决定这里发生了什么。

显然它需要是一个字符串(如果字符串不是密封类,它可能是从字符串派生的东西,但对于密封类来说这是不可能的。)

所以唯一有意义的(除了非常不可能的编译器错误)是info不是字符串。

答案 1 :(得分:2)

错误表明了答案:

  

'DataType'不包含'YourExtensionMethodName'

的定义

在这种情况下,我的猜测是“info”(ViewObjectDdlCommand.info)不是字符串,而是DataType。尝试将其更改为:

OpenCodeWindow(
    string.Format("{0} - {1} - {2}", 
        dsn.Name, 
        objectName, 
        info.ToString().ToTitleCase()),
        schemaItemType,
        objectName);