除此之外,什么会导致扩展方法来产生这样一个编译器错误:
“数据类型”不包含一个定义'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);
}
}
}
说得没错。这是一个明显的颅 - 直肠倒置病例。 我应该为我的所有代表发布赏金。 – 2009-10-02 20:44:45
没问题,在那里感觉像马普尔小姐那么有趣。 :) – 2009-10-02 20:49:25