不确定我在这里做错了什么。无法识别扩展方法。
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;
}
}
}
答案 0 :(得分:35)
您尝试在类型字符串上调用它。您需要在字符串 instance 上调用它,例如
"{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");
扩展方法的意思是它们在扩展类型上看起来像实例方法。您无法在扩展类型上创建看似 static 方法的扩展方法。
答案 1 :(得分:10)
您正在定义实例扩展方法,然后尝试将其用作静态方法。 (C#不能定义静态扩展方法,尽管F#也是如此。)
而不是:
result = string.SafeFormat("Hello");
你想要的东西:
result = "Hello".SafeFormat();
即。您正在对字符串实例进行操作(在本例中为“Hello”)。
答案 2 :(得分:3)
扩展方法出现在类型的实例上,而不是类型本身(例如静态成员)。
答案 3 :(得分:2)
试
"Hello".SafeFormat("{0} {1}", "two", "words")