C #, WinForms и методы расширения - PullRequest
2 голосов
/ 03 октября 2009

Вопрос

Помимо всех очевидных ответов, что вызвало бы методы расширения генерировать ошибки компилятора, подобные этому:

'DataType' не содержит определения для 'YourExtensionMethodName'

У меня есть настоящий тупик, и он подробно описан ниже. Я исчерпал все возможные причины, о которых могу думать.

Сценарий

  • У меня есть несколько методов расширения, определенных в различных статических классах в DLL, которая используется приложением WinForms.
  • Сигнатуры методов расширения не конфликтуют с сигнатурами методов в классе, который я расширяю (в данном случае String).
  • И DLL, и приложение WinForms написаны на C #.
  • И DLL, и приложение WinForms настроены для работы с .NET 3.5.
  • Классы-потребители включают ссылку на пространство имен, которое определяет метод расширения. Его орфография была проверена.
  • Если я ссылаюсь на класс расширения напрямую, появляются методы расширения. Например, если я наберу StringExtensions., Intellisense будет отображаться как обычно со всеми моими методами расширения.
  • EDIT : ошибки возникают в приложении 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 ]

4 голосов
/ 03 октября 2009

Из вашего фрагмента кода я вижу, что вы звоните ToTitleCase на что-то под названием info. Но я не вижу тип этой переменной, которая будет определять, что здесь происходит.

Очевидно, что это должна быть строка (если строка не была запечатанным классом, это может быть что-то производное от строки, но это невозможно для запечатанного класса).

Таким образом, единственное, что имеет смысл (кроме очень маловероятной ошибки компилятора), это то, что info не является строкой.

2 голосов
/ 03 октября 2009

Ошибка подсказывает ответ:

'DataType' не содержит определения для 'YourExtensionMethodName'

В этом случае я предполагаю, что "info" (ViewObjectDdlCommand.info) - это не строка, а скорее DataType. Попробуйте изменить его на:

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