功能类似于   GetComponents  等函数:

1、  不用接口, 使用抽象类    继承自  Monobehaiour

[csharp] view plain copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. public abstract class LayerPanelBase :MonoBehaviour  
  2. {  
  3.     public abstract void InitView(HeroModel heroModel, CharacterAttributeView characterAttributeView);  
  4. }  

然后执行   .GetComponent<LayerPanelBase>().InitView(myHeroModel, this);

2、原理类似   网上可以搜

[csharp] view plain copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. using UnityEngine;  
  2. using System;  
  3. using System.Collections;  
  4. using System.Collections.Generic;  
  5. using System.Linq;  
  6.   
  7. public static class GameObjectEx  
  8. {  
  9.     public static T GetInterface<T>(this GameObject inObj) where T : class  
  10.     {  
  11.         if (!typeof(T).IsInterface)  
  12.         {  
  13.             Debug.LogError(typeof(T).ToString() + ": is not an actual interface!");  
  14.   
  15.             return null;  
  16.         }  
  17.         var tmps = inObj.GetComponents<Component>().OfType<T>();  
  18.         if (tmps.Count()==0) return null;  
  19.         return tmps.First();  
  20.     }  
  21.   
  22.     public static IEnumerable<T> GetInterfaces<T>(this GameObject inObj) where T : class  
  23.     {  
  24.         if (!typeof(T).IsInterface)  
  25.         {  
  26.             Debug.LogError(typeof(T).ToString() + ": is not an actual interface!");  
  27.             return Enumerable.Empty<T>();  
  28.         }  
  29.   
  30.         return inObj.GetComponents<Component>().OfType<T>();  
  31.     }  
  32. }  

定义的时候直接使用  Interface  这种方式最好了!

3、使用Linq  :

[csharp] view plain copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. var controllers = GetComponents<MonoBehaviour>()  
  2.         .Where(item => item is IInfiniteScrollSetup)  
  3.         .Select(item => item as IInfiniteScrollSetup)  
  4.         .ToList();  

扩展方法:

[csharp] view plain copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. public static List<T> GetInterfaces<T>(this GameObject obj) where T: class   
  2. {  
  3.     return obj.GetComponents<MonoBehaviour>()  
  4.            .Where(item => item is T)  
  5.            .Select(item => item as T)  
  6.            .ToList();  
  7. }  

没办法提供    GetComponent   这种  找一个的方式。

所以相对来来讲还是 第二种  GetInterface  找接口的一个

GetInterfaces    找接口的多个!