代码之家  ›  专栏  ›  技术社区  ›  Chris Ballance

向字符串类-c添加扩展方法#

  •  14
  • Chris Ballance  · 技术社区  · 15 年前

    不知道我在这里做错了什么。无法识别扩展方法。

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Text.RegularExpressions;
    using StringExtensions;
    
    
    namespace ConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {
                RunTests();
            }
    
            static void RunTests()
            {
                try
                {
                    ///SafeFormat
                    SafeFormat("Hi There");
    
                    SafeFormat("test {0}", "value");
    
                    SafeFormat("test missing second value {0} - {1}", "test1");
    
                    SafeFormat("{0}");
    
                    //regular format
                    RegularFormat("Hi There");
    
                    RegularFormat("test {0}", "value");
    
                    RegularFormat("test missing second value {0} - {1}", "test1");
    
                    RegularFormat("{0}");
    
                    ///Fails to recognize the extension method here
                    string.SafeFormat("Hello");
    
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.ToString());
                }
                Console.ReadLine();
            }
    
            private static void RegularFormat(string fmt, params object[] args)
            {
                Console.WriteLine(String.Format(fmt, args));
            }
    
            private static void SafeFormat(string fmt, params object[] args)
            {
                string errorString = fmt;
    
                try
                {
                    errorString = String.Format(fmt, args);
                }
                catch (System.FormatException) { } //logging string arguments were not correct
                Console.WriteLine(errorString);
            }
    
        }
    
    }
    
    namespace StringExtensions
    {
        public static class StringExtensionsClass
        {
            public static string SafeFormat(this string s, string fmt, params object[] args)
            {
                string formattedString = fmt;
    
                try
                {
                    formattedString = String.Format(fmt, args);
                }
                catch (System.FormatException) { } //logging string arguments were not correct
                return formattedString;
            }
        }
    }
    
    4 回复  |  直到 14 年前
        1
  •  35
  •   Jon Skeet    15 年前

    你想打电话给 类型 字符串。你需要用一个字符串来调用它 实例 ,例如

    "{0}".SafeFormat("Hello");
    

    诚然,这并不能满足您的需求,因为safeformat方法实际上完全忽略了第一个参数( s 无论如何。它应该是这样的:

        public static string SafeFormat(this string fmt, params object[] args)
        {
            string formattedString = fmt;
    
            try
            {
                formattedString = String.Format(fmt, args);
            }
            catch (FormatException) {} //logging string arguments were not correct
            return formattedString;
        }
    

    然后你可以打电话:

    "{0} {1}".SafeFormat("Hi", "there");
    

    扩展方法的要点是它们看起来像 实例 扩展类型的方法。无法创建似乎是 静止的 扩展类型的方法。

        2
  •  10
  •   Noldorin    15 年前

    你在定义一个 实例 扩展方法,然后尝试将其用作 静止的 方法。(C不能定义静态扩展方法,尽管F是针对这个问题的。)

    而不是:

    result = string.SafeFormat("Hello");
    

    你想要类似的东西:

    result = "Hello".SafeFormat();
    

    例如,您正在对字符串实例进行操作(在本例中为“hello”)。

        3
  •  3
  •   Rex M    15 年前

    扩展方法出现在类型的实例上,而不是类型本身(例如静态成员)。

        4
  •  2
  •   Marek Karbarz    15 年前

    尝试

    "Hello".SafeFormat("{0} {1}", "two", "words")