2009-10-02 100 views
2

问题C#,WinForms和扩展方法

所有明显的答案

除此之外,什么会导致扩展方法来产生这样一个编译器错误:

“数据类型”不包含一个定义'YourExtensionMethodName'

我在这里有一个真正的stumper,它在下面详细说明。我已经用尽了所有我能想到的可能原因。

方案

  • 我有一对夫妇在由一个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); 
     } 
    } 
} 

回答

4

从你的代码片段中,我可以看到你打电话给ToTitleCase的东西叫做info。但是我看不到那个变量的类型,这是决定这里发生了什么的事情。

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

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

+0

说得没错。这是一个明显的颅 - 直肠倒置病例。 我应该为我的所有代表发布赏金。 – 2009-10-02 20:44:45

+0

没问题,在那里感觉像马普尔小姐那么有趣。 :) – 2009-10-02 20:49:25

2

错误提示了答案:

“数据类型”不包含定义“YourExtensionMethodName”

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

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

对不起,困惑。错误信息实际上是“'字符串'不包含'ToTitleCase'的定义”,而info绝对是字符串类型的变量。 – 2009-10-02 20:40:23

+0

正确!不是!! “绝对是一个字符串类型的变量!上帝,我讨厌乌鸦派的味道!: - 所有打字和一点检查都能解决这个问题。*叹* – 2009-10-02 20:42:58