Class Reflector
- Namespace
- Heleonix.Reflection
- Assembly
- Heleonix.Reflection.dll
Provides functionality for working with reflection.
public static class Reflector
- Inheritance
-
Reflector
- Inherited Members
Fields
DefaultBindingFlags
The default binding flags.
public const BindingFlags DefaultBindingFlags = Instance | Static | Public
Field Value
Methods
CreateGetter<TObject, TReturn>(Expression<Func<TObject, TReturn>>)
Creates a getter. Works with exactly specified types without conversion. This is the fastest implementation.
public static Func<TObject, TReturn> CreateGetter<TObject, TReturn>(Expression<Func<TObject, TReturn>> memberPath)
Parameters
memberPathExpression<Func<TObject, TReturn>>The path to a member.
Returns
- Func<TObject, TReturn>
A compiled delegate to get a value or
nullif thememberPathisnull.
Type Parameters
TObjectThe concrete type of the container's object.
TReturnThe concrete type of the member.
Examples
var getter = Reflector.CreateGetter(dt => dt.Date.Month);
var value = getter(DateTime.Now);
// value == DateTime.Now.Date.Month.
CreateGetter<TObject, TReturn>(string, Type)
Creates a getter. Can create getters with any convertable types for polimorphic usage.
public static Func<TObject, TReturn> CreateGetter<TObject, TReturn>(string memberPath, Type containerType = null)
Parameters
memberPathstringThe path to a member.
containerTypeTypeA type of a container's object which contains the member. If null is specified, then
TObjectis used without conversion.
Returns
- Func<TObject, TReturn>
A compiled delegate to get a value or
nullif thememberPathisnullor empty.
Type Parameters
TObjectThe type of the desired object in a delegate to create.
TReturnThe type of the desired member in a delegate to create.
Examples
var getter = Reflector.CreateGetter{object, object}("Date.Month", typeof(DateTime));
var value = getter(DateTime.Now);
// value == DateTime.Now.Date.Month.
CreateSetter<TObject, TValue>(Expression<Func<TObject, TValue>>)
Creates the setter. Works with exactly specified types without conversion. This is the fastest implementation.
public static Action<TObject, TValue> CreateSetter<TObject, TValue>(Expression<Func<TObject, TValue>> memberPath)
Parameters
memberPathExpression<Func<TObject, TValue>>The path to a member.
Returns
- Action<TObject, TValue>
A compiled delegate to set a value or
nullifmemberPathisnull.
Type Parameters
TObjectThe type of the object.
TValueThe type of the final member.
Examples
public class Root { public Child Child { get; set; } = new Child(); } public class Child { public int Value { get; set; } }
var setter = Reflector.CreateSetter{Root, int}(r => r.Child.Value); var root = new Root();
setter(root, 12345);
// root.Child.Value == 12345.
CreateSetter<TObject, TValue>(string, Type)
Creates a setter. Can create setters with any convertable types for polimorphic usage.
public static Action<TObject, TValue> CreateSetter<TObject, TValue>(string memberPath, Type containerType = null)
Parameters
memberPathstringThe path to a member.
containerTypeTypeA type of a container's object which contains the member. If null is specified, then
TObjectis used without conversion.
Returns
- Action<TObject, TValue>
A compiled delegate to set a value or
nullif thememberPathisnullor empty.
Type Parameters
TObjectThe type of the desired object in a delegate to create.
TValueThe type of the desired member in a delegate to create.
Examples
public class Root { public Child Child { get; set; } = new Child(); } public class Child { public int Value { get; set; } }
var setter = Reflector.CreateSetter{Root, int}("Child.Value", typeof(Root)); var root = new Root();
setter(root, 12345);
// root.Child.Value == 12345.
GetInfo(object, Type, string, Type[], BindingFlags)
Gets information about members.
public static MemberInfo[] GetInfo(object instance, Type type, string memberPath, Type[] parameterTypes = null, BindingFlags bindingFlags = BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public)
Parameters
instanceobjectA root object.
typeTypeA type of a root object. If
instanceis notnull, then its type is used instead.memberPathstringA path to a member.
parameterTypesType[]Types of parameters to find methods or constructors. If
nullis passed, then types of parameters are ignored.bindingFlagsBindingFlagsBinding flags to find members.
Returns
- MemberInfo[]
Information about found members or an empty array if no members are found or they are not reachable or they are not accessible.
Examples
var dt = DateTime.Now;
var info = Reflector.GetInfo(instance: dt, type: null, memberPath: "TimeOfDay.Negate");
// info[0].Name == "Negate"; // info[0].MemberType == MemberTypes.Property.
Exceptions
- TargetException
An intermediate member on a path thrown an exception. See inner exception for details.
GetMemberPath(LambdaExpression)
Gets a path to a member using the specified (probably dynamically built) expression.
public static string GetMemberPath(LambdaExpression memberPath)
Parameters
memberPathLambdaExpressionAn expression to find a member.
Returns
- string
A name of a member or an empty string if
memberPathisnull. .
GetMemberPath<TObject>(Expression<Action<TObject>>)
Gets a path to a member which returns void.
public static string GetMemberPath<TObject>(Expression<Action<TObject>> memberPath)
Parameters
memberPathExpression<Action<TObject>>An expression to find a member.
Returns
- string
A path to a member.
Type Parameters
TObjectA type of an object.
Examples
var path = Reflector.GetMemberPath{List{int}}(list => list.Clear());
// path: "Clear".
GetMemberPath<TObject>(Expression<Func<TObject, object>>)
Gets a path to a member which returns some type.
public static string GetMemberPath<TObject>(Expression<Func<TObject, object>> memberPath)
Parameters
memberPathExpression<Func<TObject, object>>An expression to find a member.
Returns
- string
A path to a member.
Type Parameters
TObjectA type of an object.
Examples
var path = Reflector.GetMemberPath{DateTime}(dt => dt.TimeOfDay.Negate());
// path: "TimeOfDay.Negate".
GetTypes(string)
Gets the types by a simple name (a name without namespace) in the calling assembly and in the assemblies loaded into the current domain.
public static Type[] GetTypes(string simpleName)
Parameters
simpleNamestringA simple name of types to load.
Returns
- Type[]
An array of found types.
Get<TReturn>(object, Type, string, out TReturn, BindingFlags)
Gets a value by the provided path.
public static bool Get<TReturn>(object instance, Type type, string memberPath, out TReturn value, BindingFlags bindingFlags = BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public)
Parameters
instanceobjectA root object.
typeTypeA type of a root object. If
instanceis notnull, then its type is used instead.memberPathstringA path to a member.
valueTReturnA gotten value.
bindingFlagsBindingFlagsBinding flags to find members.
Returns
- bool
truein case of success, otherwisefalseifmemberPathisnullor empty orinstanceisnullandtypeisnullor a target member or one of intermediate members was not found or a member is not static and its container is null or a target member or an intermediate member is neither PropertyInfo nor FieldInfo or a target value is not of typeTReturn.
Type Parameters
TReturnA type of a value to be set with the target value.
Examples
var success = Reflector.Get(DateTime.Now, null, "TimeOfDay.Hours", out int value);
// success == true;
// value == DateTime.Now.TimeOfDay.Hours;
or
var success = Reflector.Get(typeof(int), null, "CustomAttributes[0].AttributeType", out int value);
// success == true;
// value == typeof(int).CustomAttributes.First().AttributeType;
or
var success = Reflector.Get(typeof(int), null, "CustomAttributes[0]", out int value);
// success == true;
// value == typeof(int).CustomAttributes.First().
or
var rec = new Record(new Dictionary<string, string> { { "K e y", "V a l u e" } });
var success = Reflector.Get(rec, null, "Dic[K e y].Length", out int value);
record class Record(Dictionary<string, string> Dic);
// success == true;
// value == rec.Dic["K e y"].Length;
Exceptions
- TargetException
Target thrown an exception during execution. See inner exception for details.
Invoke<TReturn>(object, Type, string, Type[], out TReturn, BindingFlags, params object[])
Invokes a method or constructor by the provided path. Use "ctor" to invoke constructors, i.e."Item.SubItem.ctor".
public static bool Invoke<TReturn>(object instance, Type type, string memberPath, Type[] parameterTypes, out TReturn returnValue, BindingFlags bindingFlags = BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public, params object[] arguments)
Parameters
instanceobjectA root object.
typeTypeA type of a root object. If
instanceis notnull, then its runtime type is used instead.memberPathstringA path to a member to invoke.
parameterTypesType[]Types of parameters to find a method by. Pass
nullto ignore parameters, or an empty array for parameterless methods.returnValueTReturnA value to be returned if a member is not void.
bindingFlagsBindingFlagsBinding flags to find members.
argumentsobject[]Arguments to be passed into a member to invoke.
Returns
- bool
truein case of success, otherwisefalseifmemberPathisnullor empty orinstanceisnullandtypeisnullor a target member or one of intermediate members was not found or an intermediate member is neither PropertyInfo nor FieldInfo or an intermediate member is not static and its container is null or a target member is not MethodBase or a target value is not of typeTReturn.
Type Parameters
TReturnA type of a value to be returned.
Examples
var success = Reflector.Invoke( DateTime.Now, null, "Date.AddYears", new[] { typeof(int) }, out DateTime result, arguments: 10);
// success == true; // result.Year == DateTime.Now.Date.Year + 10.
Exceptions
- TargetException
Target thrown an exception during execution. See inner exception for details.
IsStatic(PropertyInfo)
Determines whether the specified property is static by its getter (if it is defined) or by its setter (if it is defined).
public static bool IsStatic(PropertyInfo info)
Parameters
infoPropertyInfoThe property information.
Returns
- bool
trueif the specified property is static; otherwise,false.
Set(object, Type, string, object, BindingFlags)
Sets a provided value by the provided path.
public static bool Set(object instance, Type type, string memberPath, object value, BindingFlags bindingFlags = BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public)
Parameters
instanceobjectA root object.
typeTypeA type of a root object. If
instanceis notnull, then its type is used instead.memberPathstringA path to a member.
valueobjectA value to be set.
bindingFlagsBindingFlagsBinding flags to find members.
Returns
- bool
truein case of success, otherwisefalseifmemberPathisnullor empty orinstanceisnullandtypeisnullor a target member or one of intermediate members was not found or a member is not static and its container is null or a target member or an intermediate member is neither PropertyInfo nor FieldInfo.
Examples
This code demonstrates common scenarios.
public class Root
{
public Child Child { get; set; } = new Child();
public Child[] Children { get; set; } = new Child[] { new Child(), new Child() };
}
public class Child { public int Value { get; set; } }
var root = new Root();
var success1 = Reflector.Set(root, null, "Child.Value", 111);
var success2 = Reflector.Set(root, null, "Children[0].Value", 222);
var success3 = Reflector.Set(root, null, "Children[1]", new Child() { Value = 333 });
// success1 == true;
// success2 == true;
// success3 == true;
// root.Child.Value == 111;
// root.Children[0].Value == 222;
// root.Children[1].Value == 333.
This code demonstrates usage of dictionaries.
var rec = new Record(new Dictionary<string, string> { { "K e y", "V a l u e" } });
var success = Reflector.Set(rec, null, "Dic[K e y]", "New Value");
record class Record(Dictionary<string, string> Dic);
// success == true;
// value == record.Dic["K e y"];
SetCoerced(object, Type, string, object, BindingFlags)
Sets a provided value by the provided path with coercion into the target member type.
public static bool SetCoerced(object instance, Type type, string memberPath, object value, BindingFlags bindingFlags = BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public)
Parameters
instanceobjectA root object.
typeTypeA type of a root object. If
instanceis notnull, then its type is used instead.memberPathstringA path to a member.
valueobjectA value to be set.
bindingFlagsBindingFlagsBinding flags to find members.
Returns
- bool
truein case of success, otherwisefalseifmemberPathisnullor empty orinstanceisnullandtypeisnullor a target member or one of intermediate members was not found or a member is not static and its container is null or a target member or an intermediate member is neither PropertyInfo nor FieldInfo.
Examples
public class Root { public Child Child { get; set; } = new Child(); public Child[] Children { get; set; } = new Child[] { new Child(), new Child() }; }
public class Child { public int Value { get; set; } }
var root = new Root();
var success1 = Reflector.Set(root, null, "Child.Value", 111); var success2 = Reflector.Set(root, null, "Children[0].Value", 222); var success3 = Reflector.Set(root, null, "Children[1]", new Child() { Value = 333 });
// success1 == true; // success2 == true; // success3 == true;
// root.Child.Value == 111; // root.Children[0].Value == 222; // root.Children[1].Value == 333.