[英]c# extension method to define method that behaves like a static class / type method, not an instance method
[英]Extension Method of List<t> not recognize Instance method of the class C#
我有一个联系人类,我想为该类的列表创建一个扩展方法,但它无法识别我的con.GetName()函数。 我使用正确的引用,它可以识别类名,尽管它不能识别该类的实例方法
public static string ToString (this List<Contact> Contacts)
{
string str = "";
foreach(Contact con Contacts)
{
str += con.GetName() + ", ";
}
return str.Substring(0, str.Length - 2);
}
编辑:我删除了在功能行,但现在又有一个错误,这一次它标记函数的名称(ToString),我试图更改名称,但没有任何成功或更改。 现在,GetName()工作了。
Severity Code Description Project File Line Suppression State
Error CS0051 Inconsistent accessibility: parameter type 'List<Contact>' is less accessible than method 'MyExtensions.ToString(List<Contact>)' Whatsapp D:\Whatsapp Versions\17.6\Whatsapp\ExtensionMethods.cs 100 Active
这是错字吗? 您不小心写了<Contact>
:
public static string ToString <Contact>(this List<Contact> Contacts)
^^^^^^^^^^
here
这使Contact
成为泛型类型参数,使您的扩展方法可在任何List<T>
。 显然,您将无法访问Contact
的成员,因为该列表可以是任何内容的列表。 要解决此问题,请删除通用参数:
public static string ToString(this List<Contact> Contacts)
请注意,当您直接在List<Contact>
上调用此扩展方法时,将不会选择该扩展方法,因为List
已具有ToString
方法(实际上所有类都可以...)。 于是打电话给你的唯一途径ToString
是SurroundClass.ToString(someList)
我建议您重命名该方法。
您的代码至少有两个问题:
如果您调用扩展名ToString()
,将无法像扩展名一样使用它,因为如果您有一个
List<Contact> myContacts = ... Console.WriteLine(myContacts.ToString());
编译器将始终选择List<T>
类的* instance方法ToString()
而不是您的扩展名。
您声明了通用方法( ToString<Contact>
),当您只想在此处接受List<Contact>
时,则不需要此方法。 请注意,您在此处编写的Contact
现在是通用类型参数,而不是您的Contact
类型。 这就是为什么编译器不知道GetName()
方法的原因: con
不是Contact
类型,而是在编译时不知道的泛型类型。
我建议使用string.Join
而不是“手工”连接字符串:
所以最后的建议是:
public static string AsString(this List<Contact> contacts) =>
string.Join(", ", contacts.Select(c => c.GetName());
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.