通过类似GetComponent从组件中直接获得接口的三种方式

孙广东  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().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(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().OfType();
        if (tmps.Count()==0) return null;
        return tmps.First();
    }

    public static IEnumerable GetInterfaces(this GameObject inObj) where T : class
    {
        if (!typeof(T).IsInterface)
        {
            Debug.LogError(typeof(T).ToString() + ": is not an actual interface!");
            return Enumerable.Empty();
        }

        return inObj.GetComponents().OfType();
    }
}

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



3、使用Linq  :

            var controllers = GetComponents()
                    .Where(item => item is IInfiniteScrollSetup)
                    .Select(item => item as IInfiniteScrollSetup)
                    .ToList();

扩展方法:

    public static List GetInterfaces(this GameObject obj) where T: class 
    {
        return obj.GetComponents()
               .Where(item => item is T)
               .Select(item => item as T)
               .ToList();
    }

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

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

GetInterfaces    找接口的多个!



http://blog.csdn.net/u010019717

你可能感兴趣的:(unity3d,Editor私人定制)