public void TestParseEx() { for (int i = 0; i < 150; i++) { BindingFlags value = (BindingFlags)i; Assert.AreEqual(value, EnumExt.ParseEx <BindingFlags>(value.ToString())); Assert.AreEqual(value, EnumExt.ParseEx <BindingFlags>(value.GetDescription())); } Assert.AreEqual((TestEnum)0, EnumExt.ParseEx <TestEnum>(" 0")); Assert.AreEqual(TestEnum.A, EnumExt.ParseEx <TestEnum>("A ")); Assert.AreEqual(TestEnum.A, EnumExt.ParseEx <TestEnum>("-1 ")); Assert.AreEqual(TestEnum.A, EnumExt.ParseEx <TestEnum>("A Des")); Assert.AreEqual(TestEnum.B, EnumExt.ParseEx <TestEnum>(" B ")); Assert.AreEqual(TestEnum.B, EnumExt.ParseEx <TestEnum>(" -2 ")); Assert.AreEqual(TestEnum.B, EnumExt.ParseEx <TestEnum>("B Des")); Assert.AreEqual(TestEnum.C, EnumExt.ParseEx <TestEnum>("C")); Assert.AreEqual(TestEnum.C, EnumExt.ParseEx <TestEnum>("-3")); Assert.AreEqual(TestEnum.C, EnumExt.ParseEx <TestEnum>("C Des")); Assert.AreEqual(TestEnum.D, EnumExt.ParseEx <TestEnum>("D")); Assert.AreEqual(TestEnum.D, EnumExt.ParseEx <TestEnum>("-4")); Assert.AreEqual(TestEnum.D, EnumExt.ParseEx <TestEnum>("D Des")); Assert.AreEqual(TestEnum.E, EnumExt.ParseEx <TestEnum>("-5")); Assert.AreEqual(TestEnum.E, EnumExt.ParseEx <TestEnum>("E")); Assert.AreEqual((TestEnum2)0, EnumExt.ParseEx <TestEnum2>("0")); Assert.AreEqual(TestEnum2.A, EnumExt.ParseEx <TestEnum2>(" A ")); Assert.AreEqual(TestEnum2.A, EnumExt.ParseEx <TestEnum2>(" 1 ")); Assert.AreEqual(TestEnum2.A, EnumExt.ParseEx <TestEnum2>("A Des")); Assert.AreEqual(TestEnum2.B, EnumExt.ParseEx <TestEnum2>("B ")); Assert.AreEqual(TestEnum2.B, EnumExt.ParseEx <TestEnum2>(" +2 ")); Assert.AreEqual(TestEnum2.B, EnumExt.ParseEx <TestEnum2>("B Des")); Assert.AreEqual(TestEnum2.C, EnumExt.ParseEx <TestEnum2>("C ")); Assert.AreEqual(TestEnum2.C, EnumExt.ParseEx <TestEnum2>(" +4 ")); Assert.AreEqual(TestEnum2.C, EnumExt.ParseEx <TestEnum2>("C Des")); Assert.AreEqual(TestEnum2.D, EnumExt.ParseEx <TestEnum2>("D ")); Assert.AreEqual(TestEnum2.D, EnumExt.ParseEx <TestEnum2>("0008")); Assert.AreEqual(TestEnum2.D, EnumExt.ParseEx <TestEnum2>("D")); Assert.AreEqual(TestEnum2.AB, EnumExt.ParseEx <TestEnum2>("AB Des")); Assert.AreEqual(TestEnum2.AB, EnumExt.ParseEx <TestEnum2>("A,B Des")); Assert.AreEqual(TestEnum2.AB, EnumExt.ParseEx <TestEnum2>("1,2")); Assert.AreEqual(TestEnum2.AB, EnumExt.ParseEx <TestEnum2>("3")); Assert.AreEqual(TestEnum2.AB, EnumExt.ParseEx <TestEnum2>("A Des , B Des")); Assert.AreEqual(TestEnum2.BC, EnumExt.ParseEx <TestEnum2>("BC Des ")); Assert.AreEqual(TestEnum2.BC, EnumExt.ParseEx <TestEnum2>("2, 4, 2, 4,C Des ")); Assert.AreEqual(TestEnum2.BC, EnumExt.ParseEx <TestEnum2>("C Des , B Des")); Assert.AreEqual(TestEnum2.A | TestEnum2.BC, EnumExt.ParseEx <TestEnum2>("C Des , B Des, A Des")); Assert.AreEqual(TestEnum2.A | TestEnum2.BC, EnumExt.ParseEx <TestEnum2>("4 , B Des, A Des, 3")); Assert.AreEqual(TestEnum2.A | TestEnum2.BC, EnumExt.ParseEx <TestEnum2>("7")); Assert.AreEqual(TestEnum2.A | TestEnum2.BC, EnumExt.ParseEx <TestEnum2>("BC Des , , A Des")); Assert.AreEqual(TestEnum2.A | TestEnum2.BC, EnumExt.ParseEx <TestEnum2>("AB Des , C Des")); Assert.AreEqual(TestEnum2.D | TestEnum2.BC, EnumExt.ParseEx <TestEnum2>("BC Des , D")); Assert.AreEqual(TestEnum2.All, EnumExt.ParseEx <TestEnum2>("BC Des,A Des,D")); Assert.AreEqual(TestEnum2.All, EnumExt.ParseEx <TestEnum2>("15")); Assert.AreEqual(TestEnum2.All, EnumExt.ParseEx <TestEnum2>("+1,+2, , 4, 8, ")); Assert.AreEqual(TestEnum2.All, EnumExt.ParseEx <TestEnum2>("All Des")); Assert.AreEqual(TestEnum2.All, EnumExt.ParseEx <TestEnum2>("BC Des,AB Des,D")); Assert.AreEqual(TestEnum2.All | (TestEnum2)128, EnumExt.ParseEx <TestEnum2>("BC Des,AB Des,D, 128")); Assert.AreEqual(TestEnum2.All | (TestEnum2)128, EnumExt.ParseEx <TestEnum2>("15, 128")); Assert.AreEqual(TestEnum2.All | (TestEnum2)128, EnumExt.ParseEx <TestEnum2>("143")); Assert.AreEqual(TestEnum2.All | (TestEnum2)128, EnumExt.ParseEx <TestEnum2>("BC Des,AB Des,D,+128")); }
/// <summary> /// Выполнить метод methodName у объекта /// </summary> /// <param name="obj">объект</param> /// <param name="methodName">имя метода</param> /// <param name="bindingFlags">условие поиска метода</param> /// <param name="args">аргументы выполняемого метода</param> /// <exception cref="ArgumentNullException"></exception> /// <exception cref="Exception"></exception> /// <returns></returns> public static object GetMethodValue(this object obj, string methodName, BindingFlags bindingFlags, params object[] args) { if (obj == null) { ExceptionGenerator.Run <ArgumentNullException>("Аргумент \"obj\" равен null"); } if (String.IsNullOrEmpty(methodName)) { ExceptionGenerator.Run <ArgumentNullException>("Аргумент \"methodName\" равен null или пустой"); } Type type = obj.GetType(); try { MethodInfo methodInfo = null; methodInfo = type.GetMethod(methodName, bindingFlags); if (methodInfo == null) { ExceptionGenerator.Run <ArgumentNullException>("Метод \"{0}\" в объекте типа \"{1}\" не найдено по условиям поиска \"{2}\"", methodName, type, bindingFlags.ToString()); } return(methodInfo.Invoke(obj, args)); } catch (Exception ex) { throw ExceptionGenerator.Run(ex, "Ошибка при выполнения метода \"{0}\" объекте типа \"{1}\"", methodName, type); } }
public void TestGetDescription() { for (int i = 0; i < 129; i++) { BindingFlags value = (BindingFlags)i; Assert.AreEqual(value.ToString(), value.GetDescription()); } Assert.AreEqual("0", ((TestEnum)0).GetDescription()); Assert.AreEqual("A Des", TestEnum.A.GetDescription()); Assert.AreEqual("B Des", TestEnum.B.GetDescription()); Assert.AreEqual("C Des", TestEnum.C.GetDescription()); Assert.AreEqual("D Des", TestEnum.D.GetDescription()); Assert.AreEqual("E", TestEnum.E.GetDescription()); Assert.AreEqual("0", ((TestEnum2)0).GetDescription()); Assert.AreEqual("A Des", TestEnum2.A.GetDescription()); Assert.AreEqual("B Des", TestEnum2.B.GetDescription()); Assert.AreEqual("C Des", TestEnum2.C.GetDescription()); Assert.AreEqual("D", TestEnum2.D.GetDescription()); Assert.AreEqual("AB Des", TestEnum2.AB.GetDescription()); Assert.AreEqual("BC Des", TestEnum2.BC.GetDescription()); Assert.AreEqual("A Des, BC Des", (TestEnum2.BC | TestEnum2.A).GetDescription()); Assert.AreEqual("BC Des, D", (TestEnum2.BC | TestEnum2.D).GetDescription()); Assert.AreEqual("All Des", TestEnum2.All.GetDescription()); Assert.AreEqual("All Des, 128", (TestEnum2.All | (TestEnum2)128).GetDescription()); }
public static void PrintAllFields(this Type type, BindingFlags flags) { FieldInfo[] fields = type.GetFields(); for (int i = 0; i < fields.Length; i++) { Debug.Log(fields[i].Name + ", field, " + flags.ToString()); } PropertyInfo[] props = type.GetProperties(flags); for (int i = 0; i < props.Length; i++) { Debug.Log(props[i].Name + ", property, " + flags.ToString()); } MethodInfo[] methods = type.GetMethods(flags); for (int i = 0; i < methods.Length; i++) { Debug.Log(methods[i].Name + ", method, " + flags.ToString()); } }
private void AddScopeFilterButton(GameObject parent, BindingFlags flags, bool setAsActive = false) { string lbl = flags == BindingFlags.Default ? "All" : flags.ToString(); var color = setAsActive ? enabledButtonColor : disabledButtonColor; var button = UIFactory.CreateButton(parent, "Filter_" + flags, lbl, color); UIFactory.SetLayoutElement(button.Component.gameObject, minHeight: 25, flexibleHeight: 0, minWidth: 70, flexibleWidth: 0); scopeFilterButtons.Add(flags, button); button.OnClick += () => { SetFilter(flags); }; }
private static string GetKey(string name, BindingFlags flags, params Type[] types) { StringBuilder sb = new StringBuilder(name); sb.Append("_").Append(flags.ToString()); types?.ForEach(t => { sb.Append("_") .Append(t.GUID); }); return(sb.ToString()); }
/// <summary> /// Gets the property information. /// </summary> /// <param name="propertyName">Name of the property.</param> /// <param name="bindingFlags">The binding flags.</param> /// <param name="type">The type.</param> /// <param name="throwExceptionWhenNotFound">Throw exception when property not found.</param> /// <returns>The property info.</returns> internal static PropertyInfo GetPropertyInfo(string propertyName, BindingFlags bindingFlags, Type type, bool throwExceptionWhenNotFound = true) { PropertyInfo propertyInfo = type.GetProperty(propertyName, bindingFlags); if (propertyInfo == null && throwExceptionWhenNotFound) { throw new ReflectionHelperException(string.Format(CultureInfo.CurrentCulture, Strings.ReflectionHelper_GetPropertyInfo_property_couldnot_be_found, propertyName, type.AssemblyQualifiedName)) { Data = { { "BindingFlags", bindingFlags.ToString() } } }; } return(propertyInfo); }
public override EventInfo GetEvent(string name, BindingFlags bindingAttr) { Console.WriteLine("Call to GetEvent: {0}, {1}", name, bindingAttr.ToString()); return null; }
public override PropertyInfo[] GetProperties(BindingFlags bindingAttr) { Console.WriteLine("Call to GetProperties: {0}", bindingAttr.ToString()); return(new PropertyInfo[] { }); }
public override MethodInfo[] GetMethods(BindingFlags bindingAttr) { Console.WriteLine("Call to GetMethods: {0}", bindingAttr.ToString()); return(new MethodInfo[] {}); }
public override EventInfo[] GetEvents(BindingFlags bindingAttr) { Console.WriteLine("Call to GetEvents: {0}", bindingAttr.ToString()); return(new EventInfo[] {}); }
public override EventInfo GetEvent(string name, BindingFlags bindingAttr) { Console.WriteLine("Call to GetEvent: {0}, {1}", name, bindingAttr.ToString()); return(null); }
public override ConstructorInfo[] GetConstructors(BindingFlags bindingAttr) { Console.WriteLine("Call to GetConstructors: {0}", bindingAttr.ToString()); return(new ConstructorInfo[] { }); }
private void CtorSimplestTestTypeBase(IConstructorComponent testing, Type t, BindingFlags flags) { var expecting = t.GetConstructors(flags).OrderBy(a => a.GetParameters().Count()).FirstOrDefault(); var actual = _.Object.Constructor.Simplest(t, flags); Assert.AreEqual(expecting, actual, string.Format("Failed on {0} , {1}", t.Name, flags.ToString())); }
private void ShowFields(string hierarchy, Type targetType, object container, BindingFlags bindingAttr) { EditorGUI.indentLevel++; { FieldInfo[] fields = targetType.GetFields(bindingAttr); if (fields.Length > 0) { EditorGUILayout.LabelField(bindingAttr.ToString()); foreach (FieldInfo field in fields) { if (field.DeclaringType == targetType) { bool editable = !field.IsLiteral && (editPrivate || field.IsPublic); object value = field.GetValue(container); object newValue = ShowKeyValue(hierarchy, field.Name, field.FieldType, value, editable); if (editable && value != newValue) { field.SetValue(container, newValue); } } } } } if (showProperty) { PropertyInfo[] fields = targetType.GetProperties(bindingAttr); if (fields.Length > 0) { EditorGUILayout.LabelField(bindingAttr.ToString()); foreach (PropertyInfo field in fields) { if (field.DeclaringType == targetType) { if (field.CanRead) { MethodInfo getter = field.GetGetMethod(); if (getter != null && getter.GetParameters().Length == 0) { object value = getter.Invoke(container, null); ShowKeyValue(hierarchy, field.Name, field.DeclaringType, value, false); } } } } } } EditorGUI.indentLevel--; }
public override ConstructorInfo[] GetConstructors(BindingFlags bindingAttr) { Console.WriteLine("Call to GetConstructors: {0}", bindingAttr.ToString()); return new ConstructorInfo[] { }; }
public object InvokeMember(string name, BindingFlags invokeAttr, Binder binder, object target, object[] argsOrig, ParameterModifier[] modifiers, CultureInfo culture, string[] namedParameters) { // Unwrap any AutoWrap'd objects (they need to be raw if a paramater) if (name == "[DISPID=-4]") { IEnumVARIANT rez = new EnumVariantImpl(((IEnumerable)O).GetEnumerator()); return(rez); } object[] args = ПолучитьМассивРеальныхОбъектов(argsOrig); if (culture == null) { culture = CultureInfo.InvariantCulture; } object obj; try { if (T.IsEnum && !((invokeAttr & BindingFlags.InvokeMethod) == BindingFlags.InvokeMethod)) { return(ОбернутьОбъект(Enum.Parse(T, name))); } ПроверитьНаДоступКПолям(ref invokeAttr, args.Length); if (ЭтоТип) { obj = T.InvokeMember(name, invokeAttr, binder, null, args, modifiers, culture, namedParameters); } else if (ЭтоExpandoObject) { if (invokeAttr.HasFlag(BindingFlags.InvokeMethod) && МетодыObject.ContainsKey(name)) { obj = T.InvokeMember(name, invokeAttr, binder, O, args, modifiers, culture, namedParameters); } else { obj = InvokeMemberExpandoObject(name, invokeAttr, args); } } else { obj = T.InvokeMember(name, invokeAttr, binder, O, args, modifiers, culture, namedParameters); } } catch (Exception e) { ПоследняяОшибка = e; string Ошибка = "Ошибка в методе " + name + " " + e.Message + " " + e.Source; if (e.InnerException != null) { Ошибка = Ошибка + "\r\n" + e.InnerException; } if (ВыводитьСообщениеОбОшибке) { MessageBox.Show(Ошибка); MessageBox.Show(e.StackTrace); MessageBox.Show(invokeAttr.ToString()); } throw new COMException(Ошибка); } // Так как параметры могут изменяться (OUT) и передаются по ссылке // нужно обратно обернуть параметры УстановитьИзмененияВМассиве(argsOrig, args); return(ОбернутьОбъект(obj)); }
static object internalGetFieldOrProperty(Type t, string name, BindingFlags b, object obj_or_null) { var field = t.GetField(name, b); if (field == null) { var property = t.GetProperty (name, b); if (property == null) throw new ArgumentException (string.Format ("Field or property name '{0}' not found on object of type '{1}', for binding flags '{2}'", name, t.Name, b.ToString())); else return property.GetValue (obj_or_null, null); } else return field.GetValue (obj_or_null); }
private static MethodInfo GetNonPublicMethod(Type type, string name, BindingFlags bindingAttr, Type[] paramTypes) { MethodInfo methodInfo = type.GetMethod( name: name, bindingAttr: BindingFlags.NonPublic | bindingAttr, binder: null, types: paramTypes, modifiers: null ); if (methodInfo is null) { string msg = string.Format("Couldn't find {0} method {1} in type {2}.", bindingAttr.ToString(), name, type.AssemblyQualifiedName); throw new InvalidOperationException(msg); } else { return(methodInfo); } }
static object internalGetFieldOrProperty(Type t, string name, BindingFlags b, object obj_or_null) { var field = t.GetField(name, b); if (field == null) { var property = t.GetProperty(name, b); if (property == null) { throw new ArgumentException(string.Format("Field or property name '{0}' not found on object of type '{1}', for binding flags '{2}'", name, t.Name, b.ToString())); } else { return(property.GetValue(obj_or_null, null)); } } else { return(field.GetValue(obj_or_null)); } }
public override EventInfo[] GetEvents(BindingFlags bindingAttr) { Console.WriteLine("Call to GetEvents: {0}", bindingAttr.ToString()); return new EventInfo[] {}; }
public static FieldInfo GetFieldInfo(this Type objType, string fieldName, BindingFlags flags, bool isFirstTypeChecked = true) { FieldInfo fieldInfo = objType.GetField(fieldName, flags); if (fieldInfo == null && objType.BaseType != null) { fieldInfo = objType.BaseType.GetFieldInfo(fieldName, flags, false); } if (fieldInfo == null && isFirstTypeChecked) { throw new MissingFieldException(String.Format("Field {0}.{1} could not be found with the following BindingFlags: {2}", objType.ReflectedType.FullName, fieldName, flags.ToString())); } return(fieldInfo); }
public override MethodInfo[] GetMethods(BindingFlags bindingAttr) { Console.WriteLine("Call to GetMethods: {0}", bindingAttr.ToString()); return new MethodInfo[] {}; }
public override PropertyInfo[] GetProperties(BindingFlags bindingAttr) { Console.WriteLine("Call to GetProperties: {0}", bindingAttr.ToString()); return new PropertyInfo[] { }; }
internal static string ToSTR(this BindingFlags flags) => flags == ALL ? "ALL" : flags.ToString();