使用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");
}
}
}
运行结果: