通过类似GetComponent从组件中直接获得接口的三种方式
2016-10-28
孙广东 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