天天看点

C# -- 查看类有哪些属性、方法

使用C#的反射来实现我们想要的功能,下面是实现方法和调用方法。

using System;
using System.Reflection;

public static class PropertyUtil
{
    /// <summary>
    /// 判断对象是否包含某个属性,porperty要求有set,get方法
    /// </summary>
    /// <param name="instance">object</param>
    /// <param name="propertyName">需要判断的属性</param>
    /// <returns>是否包含</returns>
    public static bool ContainProperty(this object instance, string propertyName)
    {
        if (instance != null && !string.IsNullOrEmpty(propertyName))
        {
            BindingFlags bindingFlags = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance;
            PropertyInfo _findedPropertyInfo = instance.GetType().GetProperty(propertyName, bindingFlags);
            return (_findedPropertyInfo != null);
        }
        return false;
    }

    /// <summary>
    /// 判断对象是否包含某个属性,public&private都可以
    /// </summary>
    /// <param name="instance">object</param>
    /// <param name="fieldName">需要判断的属性</param>
    /// <returns></returns>
    public static bool ContainField(this object instance, string fieldName)
    {
        if (instance != null && !string.IsNullOrEmpty(fieldName))
        {
            BindingFlags bindingFlags = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance;
            FieldInfo _fieldInfo = instance.GetType().GetField(fieldName, bindingFlags);
            return _fieldInfo != null;
        }
        return false;
    }

    /// <summary>
    /// 判断对象里面是否包含某个方法,public&private都可以
    /// </summary>
    /// <param name="instance"></param>
    /// <param name="funcName"></param>
    /// <returns></returns>
    public static bool ContainFunc(this object instance, string funcName)
    {
        if (instance != null && !string.IsNullOrEmpty(funcName))
        {
            BindingFlags bindingFlags = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance;
            MethodInfo _methodInfo = instance.GetType().GetMethod(funcName, bindingFlags);
            return _methodInfo != null;
        }
        return false;
    }

    /// <summary>
    /// 获取对象里的方法
    /// </summary>
    /// <param name="instance"></param>
    /// <param name="funcName"></param>
    /// <returns></returns>
    public static MethodInfo GetMethod(this object instance, string funcName)
    {
        if (instance != null && !string.IsNullOrEmpty(funcName))
        {
            BindingFlags bindingFlags = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance;
            MethodInfo _methodInfo = instance.GetType().GetMethod(funcName, bindingFlags);
            return _methodInfo;
        }
        return null;
    }

    /// <summary>
    /// 调用方法
    /// </summary>
    /// <param name="instance"></param>
    /// <param name="funcName"></param>
    /// <param name="args"></param>
    public static void InvokeFunc(this object instance, string funcName, params object[] args)
    {
        if (instance != null && !string.IsNullOrEmpty(funcName))
        {
            BindingFlags bindingFlags = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance;
            MethodInfo _methodInfo = instance.GetType().GetMethod(funcName, bindingFlags);
            _methodInfo.Invoke(instance, args);
        }
    }

    /// <summary>
    /// 获取对象属性值
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="t"></param>
    /// <param name="propertyname"></param>
    /// <returns></returns>
    public static string GetObjectPropertyValue<T>(T t, string propertyname)
    {
        Type type = typeof(T);
        PropertyInfo property = type.GetProperty(propertyname);
        if (property == null)
        {
            return string.Empty;
        }
        object o = property.GetValue(t, null);
        if (o == null)
        {
            return string.Empty;
        }
        return o.ToString();
    }
}

           

调用方法:

class A
{
    public int a = 1;
    public void testA(){    }
    public int AA { set; get; }
    private int b = 1;
    private void testB(string name)
    {
        Debug.Log("A name:" + name);
    }
}

public class Test : MonoBehaviour
{
	public void TestPrint() {
	    A a = new A();
        Debug.Log("ContainField a:" + a.ContainField("a"));
        Debug.Log("ContainProperty AA:" + a.ContainProperty("AA"));
        Debug.Log("ContainProperty testA:" + a.ContainFunc("testA"));
        Debug.Log("ContainField b:" + a.ContainField("b"));
        if (a.ContainFunc("testB"))
        {
            Debug.Log("ContainProperty testB: True");
            a.InvokeFunc("testB", "hello kitty");
        }
	}
}
           

运行结果:

C# -- 查看类有哪些属性、方法