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
memberPath
Expression<Func<TObject, TReturn>>The path to a member.
Returns
- Func<TObject, TReturn>
A compiled delegate to get a value or
null
if thememberPath
isnull
.
Type Parameters
TObject
The concrete type of the container's object.
TReturn
The 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
memberPath
stringThe path to a member.
containerType
TypeA type of a container's object which contains the member. If null is specified, then
TObject
is used without conversion.
Returns
- Func<TObject, TReturn>
A compiled delegate to get a value or
null
if thememberPath
isnull
or empty.
Type Parameters
TObject
The type of the desired object in a delegate to create.
TReturn
The 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
memberPath
Expression<Func<TObject, TValue>>The path to a member.
Returns
- Action<TObject, TValue>
A compiled delegate to set a value or
null
ifmemberPath
isnull
.
Type Parameters
TObject
The type of the object.
TValue
The 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
memberPath
stringThe path to a member.
containerType
TypeA type of a container's object which contains the member. If null is specified, then
TObject
is used without conversion.
Returns
- Action<TObject, TValue>
A compiled delegate to set a value or
null
if thememberPath
isnull
or empty.
Type Parameters
TObject
The type of the desired object in a delegate to create.
TValue
The 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
instance
objectA root object.
type
TypeA type of a root object. If
instance
is notnull
, then its type is used instead.memberPath
stringA path to a member.
parameterTypes
Type[]Types of parameters to find methods or constructors. If
null
is passed, then types of parameters are ignored.bindingFlags
BindingFlagsBinding 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
memberPath
LambdaExpressionAn expression to find a member.
Returns
- string
A name of a member or an empty string if
memberPath
isnull
. .
GetMemberPath<TObject>(Expression<Action<TObject>>)
Gets a path to a member which returns void
.
public static string GetMemberPath<TObject>(Expression<Action<TObject>> memberPath)
Parameters
memberPath
Expression<Action<TObject>>An expression to find a member.
Returns
- string
A path to a member.
Type Parameters
TObject
A 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
memberPath
Expression<Func<TObject, object>>An expression to find a member.
Returns
- string
A path to a member.
Type Parameters
TObject
A 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
simpleName
stringA 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
instance
objectA root object.
type
TypeA type of a root object. If
instance
is notnull
, then its type is used instead.memberPath
stringA path to a member.
value
TReturnA gotten value.
bindingFlags
BindingFlagsBinding flags to find members.
Returns
- bool
true
in case of success, otherwisefalse
ifmemberPath
isnull
or empty orinstance
isnull
andtype
isnull
or 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
TReturn
A 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
instance
objectA root object.
type
TypeA type of a root object. If
instance
is notnull
, then its runtime type is used instead.memberPath
stringA path to a member to invoke.
parameterTypes
Type[]Types of parameters to find a method by. Pass
null
to ignore parameters, or an empty array for parameterless methods.returnValue
TReturnA value to be returned if a member is not void.
bindingFlags
BindingFlagsBinding flags to find members.
arguments
object[]Arguments to be passed into a member to invoke.
Returns
- bool
true
in case of success, otherwisefalse
ifmemberPath
isnull
or empty orinstance
isnull
andtype
isnull
or 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
TReturn
A 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
info
PropertyInfoThe property information.
Returns
- bool
true
if 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
instance
objectA root object.
type
TypeA type of a root object. If
instance
is notnull
, then its type is used instead.memberPath
stringA path to a member.
value
objectA value to be set.
bindingFlags
BindingFlagsBinding flags to find members.
Returns
- bool
true
in case of success, otherwisefalse
ifmemberPath
isnull
or empty orinstance
isnull
andtype
isnull
or 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
instance
objectA root object.
type
TypeA type of a root object. If
instance
is notnull
, then its type is used instead.memberPath
stringA path to a member.
value
objectA value to be set.
bindingFlags
BindingFlagsBinding flags to find members.
Returns
- bool
true
in case of success, otherwisefalse
ifmemberPath
isnull
or empty orinstance
isnull
andtype
isnull
or 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.