C#,WinForms和扩展方法

问题

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

'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);
             }
        }
    }
    

    从你的代码片段中,我可以看到你在称为info东西上调用了ToTitleCase 。 但是我看不到那个变量的类型,这是决定这里发生了什么的事情。

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

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


    错误提示答案:

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

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

    OpenCodeWindow(
        string.Format("{0} - {1} - {2}", 
            dsn.Name, 
            objectName, 
            info.ToString().ToTitleCase()),
            schemaItemType,
            objectName);
    
    链接地址: http://www.djcxy.com/p/96945.html

    上一篇: C#, WinForms and Extension Methods

    下一篇: In C#, what happens when you call an extension method on a null object?