c# 扩展方法详解
扩展方法 能够使我们对现有类“添加方法”,而无需创建新的派生类,重新编译或者以其他方式修改原始类型。扩展方法是一种特殊的静态方法,但可以像扩张类型上的实例方法一样使用。
扩展方法的定义
- 定义一个静态类来包含静态的扩展方法
- 该方法的第一个参数指定方法所操作的类型;该参数必须以this 修饰符开头
- 在调用代码中添加一条using指令以指定扩展方法的类的命名空间
- 与实例方法一样的调用方式。
在unity 中的Dotween,还有c#中的linq中调用集合和数组的方式相同
用简单的linq的例子来举例说明
一般我们调用List.Find来查找对应的元素,或者自己定义一个方法,将list作为一个参数传递进去
对于拓展方法我们可以这样做
namespace BUBBLE
{
public static class StructExport
{
public static T XX_Find<T>(this List<T> list, Predicate<T> match)
{
for (int i = 0; i < list.Count; i++)
{
if (match(list[i]))
{
return list[i];
}
}
return default(T);
}
}
}
注意:这里的类的定义和方法的定义都有static修饰符,方法的第一个参数有this修饰符。
调用的时候我们就可以
List<string> strs = new List<string>() { "1", "2", "2", "2", "2", "2", "2", "2", "2" };
string s = strs.XX_Find((s => s == "1"));
Debug.Log(s);
这样的扩展方法是不是很简洁明了
与unity中的常用类配合
在unity中我们有遇见过DOtween中的直接拿对应的常用的unity类去调用对应的动画的方法,其实这也是unity的拓展方法
ShortcutExtensions只是做一层中转,它调用的是DOTween的相关接口,以DoMove为例:
在这里我们做一个简单的查找自身物体下的对应名字的子物体的方法
public static Transform FindInAllChild(this Transform transform, string name)
{
for (int i = 0; i < transform.childCount; i++)
{
if (transform.GetChild(i).name == name)
{
return transform.GetChild(i);
}
return FindInAllChild(transform.GetChild(i), name);
}
return null;
}
用递归的方式持续查找下一级并返回对应名字的Transfrom
transform.FindInAllChild("1");
调用方式页很简单
不仅仅这些功能 总而言之,这个扩展方法有利于我们更加便利的开发。