孙广东 2016.10.15
http://blog.csdn.net/u010019717
功能类似于 GetComponents 等函数:
1、 不用接口, 使用抽象类 继承自 Monobehaiour
public abstract class LayerPanelBase :MonoBehaviour { public abstract void InitView(HeroModel heroModel, CharacterAttributeView characterAttributeView); }
然后执行 .GetComponent<LayerPanelBase>().InitView(myHeroModel, this);
2、原理类似 网上百度可见的:
原帖:
http://forum.unity3d.com/threads/60596-GetComponents-Possible-to-use-with-C-Interfaces
using UnityEngine; using System; using System.Collections; using System.Collections.Generic; using System.Linq; public static class GameObjectEx { public static T GetInterface<T>(this GameObject inObj) where T : class { if (!typeof(T).IsInterface) { Debug.LogError(typeof(T).ToString() + ": is not an actual interface!"); return null; } var tmps = inObj.GetComponents<Component>().OfType<T>(); if (tmps.Count()==0) return null; return tmps.First(); } public static IEnumerable<T> GetInterfaces<T>(this GameObject inObj) where T : class { if (!typeof(T).IsInterface) { Debug.LogError(typeof(T).ToString() + ": is not an actual interface!"); return Enumerable.Empty<T>(); } return inObj.GetComponents<Component>().OfType<T>(); } }
定义的时候直接使用 Interface 这种方式最好了!
3、使用Linq :
var controllers = GetComponents<MonoBehaviour>() .Where(item => item is IInfiniteScrollSetup) .Select(item => item as IInfiniteScrollSetup) .ToList();
扩展方法:
public static List<T> GetInterfaces<T>(this GameObject obj) where T: class { return obj.GetComponents<MonoBehaviour>() .Where(item => item is T) .Select(item => item as T) .ToList(); }
没办法提供 GetComponent 这种 找一个的方式。
所以相对来来讲还是 第二种 GetInterface 找接口的一个
GetInterfaces 找接口的多个!
http://blog.csdn.net/u010019717