代码之家  ›  专栏  ›  技术社区  ›  Mike Hofer

C,WinForms和扩展方法

  •  2
  • Mike Hofer  · 技术社区  · 15 年前

    问题

    除了所有显而易见的答案外,什么会导致扩展方法生成像下面这样的编译器错误:

    “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 回复  |  直到 15 年前
        1
  •  4
  •   Daniel Earwicker    15 年前

    从您的代码片段中,我可以看到您正在调用 ToTitleCase 关于一个叫 info . 但是我看不到这个变量的类型,它决定了这里发生了什么。

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

    所以唯一有意义的(除了极不可能出现的编译器错误)是 信息 不是字符串。

        2
  •  2
  •   Reed Copsey    15 年前

    错误表明答案:

    “datatype”不包含“yourextensionmethodname”的定义

    在这种情况下,我猜是“信息”( ViewObjectDdlCommand.info )不是字符串,而是数据类型。尝试将其更改为:

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