簡體   English   中英

C#,WinForms和擴展方法

[英]C#, WinForms and Extension Methods

問題

除了所有顯而易見的答案之外,還會導致擴展方法生成此類編譯器錯誤的原因:

“數據類型”不包含“ 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 但是我看不到該變量的類型,這將決定這里發生的事情。

顯然,它必須是字符串(如果string不是密封類,則可能是從string派生的東西,但是對於密封類來說這是不可能的)。

因此,唯一有意義的(除了極不可能的編譯器錯誤)是info不是字符串。

該錯誤提示了答案:

“數據類型”不包含“ YourExtensionMethodName”的定義

在這種情況下,我的猜測是“ info”( ViewObjectDdlCommand.info )不是字符串,而是DataType。 嘗試將其更改為:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM