Skip to content

Commit

Permalink
- Change ValueHolder's namespace to Core (some items need to be repac…
Browse files Browse the repository at this point in the history
…kaged).

- Add reflection method Components (ReflectionMethodHolderXXX).
  • Loading branch information
wojiuxuihuan committed May 26, 2024
1 parent bb59763 commit 6affd8e
Show file tree
Hide file tree
Showing 115 changed files with 2,590 additions and 1,111 deletions.
2 changes: 1 addition & 1 deletion ProjectConfig~/manifest.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"dependencies": {
"com.threeyes.alivecursor.sdk": "4.3.4",
"com.threeyes.alivecursor.sdk": "4.3.5",
"com.beans.deform": "1.2.1",
"com.coffee.ui-effect": "4.0.0-preview.10",
"com.dbrizov.naughtyattributes": "2.1.4",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -272,79 +272,6 @@ public static void WrapRichText(this StringBuilder sB, string color)
}
#endregion

#region Enum

/// <summary>
/// Parse string to Enum,Int, Etc
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="myString"></param>
/// <returns></returns>
public static T Parse<T>(this string myString) where T : struct
{
T enumerable = default;
try
{
enumerable = (T)Enum.Parse(typeof(T), myString);
//Foo(enumerable); //Now you have your enum, do whatever you want.
}
catch (Exception)
{
Debug.LogErrorFormat("Parse: Can't convert {0} to enum, please check the spell.", myString);
}
return enumerable;
}

//——Flag——

/// <summary>
/// 检测使用位运算负责的枚举(标记为[Flag]),是否包含某个值(如果报错不会影响后续代码)
/// </summary>
/// <typeparam name="T">枚举类型</typeparam>
/// <param name="en">实例</param>
/// <param name="flag">某个枚举</param>
/// <returns></returns>
public static bool Has(this Enum en, Enum flag, bool ignoreZero = false)
{
try
{
if (ignoreZero && (int)(object)flag == 0)//PS:忽略 (None = 0),否则如果flag为0则一定会返回true
return false;

return en.HasFlag(flag);//PS:Unity2021.2的性能比旧版快100倍以上
//return ((int)(object)en & (int)(object)flag) == (int)(object)flag;//PS: 如果上面的方法在旧版C#不可用,可改用下面的判断
}
catch
{
return false;
}
}

/// <summary>
/// 获取Enum值的具体枚举名称(仅适用于使用了Flag标记的Enum)
/// </summary>
/// <typeparam name="TEnumType"></typeparam>
/// <param name="value"></param>
/// <returns></returns>
public static List<string> GetNamesEx(this Enum value)
{
List<string> result = new List<string>();
Type enumType = value.GetType();
foreach (int i in Enum.GetValues(enumType))
{
if (i == 0 || i == ~0)//排除None或All
continue;

Enum curEnum = Enum.Parse(enumType, i.ToString()) as Enum;
if (value.Has(curEnum))
{
result.Add(curEnum.ToString());
}
}
return result;
}
#endregion

#region Vector Common

/// <summary>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace Threeyes.Core
{
public static class LazyExtension_Enum
{
/// <summary>
/// Parse string to Enum,Int, Etc
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="myString"></param>
/// <returns></returns>
public static T Parse<T>(this string myString) where T : struct
{
T enumerable = default;
try
{
enumerable = (T)Enum.Parse(typeof(T), myString);
//Foo(enumerable); //Now you have your enum, do whatever you want.
}
catch (Exception)
{
Debug.LogErrorFormat("Parse: Can't convert {0} to enum, please check the spell.", myString);
}
return enumerable;
}

//——Flag——

/// <summary>
/// 检测使用位运算负责的枚举(标记为[Flag]),是否包含某个值(如果报错不会影响后续代码)
/// </summary>
/// <typeparam name="T">枚举类型</typeparam>
/// <param name="en">实例</param>
/// <param name="flag">某个枚举</param>
/// <returns></returns>
public static bool Has(this Enum en, Enum flag, bool ignoreZero = false)
{
try
{
if (ignoreZero && (int)(object)flag == 0)//PS:忽略 (None = 0),否则如果flag为0则一定会返回true
return false;

return en.HasFlag(flag);//PS:Unity2021.2的性能比旧版快100倍以上
//return ((int)(object)en & (int)(object)flag) == (int)(object)flag;//PS: 如果上面的方法在旧版C#不可用,可改用下面的判断
}
catch
{
return false;
}
}

/// <summary>
/// 获取Enum值的具体枚举名称,排除None或All
///
/// PS:
/// -【待确认】仅适用于使用了Flag标记的Enum
/// </summary>
/// <typeparam name="TEnumType"></typeparam>
/// <param name="value"></param>
/// <returns></returns>
public static List<string> GetNamesEx(this Enum value, bool ignoreNone = true, bool ignoreEverything = true)
{
List<string> result = new List<string>();
Type enumType = value.GetType();
foreach (int i in Enum.GetValues(enumType))//先转为Value,排除None或All为自定义名称的干扰
{
if (ignoreNone && i == 0) continue;//排除None

if (ignoreEverything && i == ~0) continue;//排除All

Enum curEnum = Enum.Parse(enumType, i.ToString()) as Enum;
if (value.Has(curEnum))
{
result.Add(curEnum.ToString());
}
}
return result;
}
}
}

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
using UnityEngine;
using System;
using System.Reflection;
using UnityEngine.Events;

namespace Threeyes.Core
{
public abstract class ReflectionMemberHolderBase : MonoBehaviour
{
public static string emptyMemberName = "___";//占位,代表不选,用于EditorGUI
public const BindingFlags defaultBindingFlags = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance;

public Type TargetType { get { return Target ? Target.GetType() : null; } }
public UnityEngine.Object Target { get { return target; } set { target = value; } }

/// <summary>
/// Target Script instance in Scene or Asset window
/// </summary>
[SerializeField] protected UnityEngine.Object target;

#region Utility

protected bool SetMember<TMemberInfo>(TMemberInfo memberInfo, UnityAction<TMemberInfo, object, object>
actSetValue, object value, Func<TMemberInfo, bool> actCheckIfCanSet = null)
where TMemberInfo : MemberInfo
{
if (memberInfo != null)
{
bool canSet = actCheckIfCanSet != null ? actCheckIfCanSet(memberInfo) : true;//默认代表可写
if (canSet)
{
if (IsSetValueValid(memberInfo, value))
{
try
{
actSetValue(memberInfo, Target, value);
return true;
}
catch (Exception e)
{
Debug.LogError("SetMember with error: \r\n" + e);
}
}
}
}
return false;
}

/// <summary>
/// 在SetValue时判断是否有效
/// (eg:如果需要排除值为null的情况,可以覆写该方法)
/// </summary>
/// <param name="memberInfo"></param>
/// <param name="value"></param>
/// <returns></returns>
protected virtual bool IsSetValueValid(MemberInfo memberInfo, object value) { return true; }

/// <summary>
///
/// Todo:
/// -将GetMemberInfo弄成链式调用,而不是包含
/// </summary>
/// <typeparam name="TMemberInfo"></typeparam>
/// <param name="actGetMemberInfo"></param>
/// <param name="memberName"></param>
/// <param name="bindingFlags"></param>
/// <returns></returns>
protected TMemberInfo GetMemberInfo<TMemberInfo>(Func<Type, string, BindingFlags, TMemberInfo> actGetMemberInfo, string memberName, BindingFlags bindingFlags = defaultBindingFlags)
where TMemberInfo : MemberInfo
{
if (TargetType == null)
return null;

if (memberName == emptyMemberName || string.IsNullOrEmpty(memberName))//该字段没选择任意Member,不当报错
return null;

TMemberInfo memberInfo = actGetMemberInfo(TargetType, memberName, bindingFlags);
if (memberInfo == null)
{
Debug.LogError("Can't find " + typeof(TMemberInfo) + " with name " + memberName + "in" + TargetType + "!");
}
return memberInfo;
}
#endregion
}
}

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading

0 comments on commit 6affd8e

Please sign in to comment.