Table of Contents

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

BindingFlags

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 the memberPath is null.

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 string

The path to a member.

containerType Type

A 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 the memberPath is null 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 if memberPath is null.

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 string

The path to a member.

containerType Type

A 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 the memberPath is null 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 object

A root object.

type Type

A type of a root object. If instance is not null, then its type is used instead.

memberPath string

A 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 BindingFlags

Binding 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 LambdaExpression

An expression to find a member.

Returns

string

A name of a member or an empty string if memberPath is null. .

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 string

A 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 object

A root object.

type Type

A type of a root object. If instance is not null, then its type is used instead.

memberPath string

A path to a member.

value TReturn

A gotten value.

bindingFlags BindingFlags

Binding flags to find members.

Returns

bool

true in case of success, otherwise false if memberPath is null or empty or instance is null and type is null 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 type TReturn.

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 object

A root object.

type Type

A type of a root object. If instance is not null, then its runtime type is used instead.

memberPath string

A 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 TReturn

A value to be returned if a member is not void.

bindingFlags BindingFlags

Binding flags to find members.

arguments object[]

Arguments to be passed into a member to invoke.

Returns

bool

true in case of success, otherwise false if memberPath is null or empty or instance is null and type is null 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 type TReturn.

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 PropertyInfo

The 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 object

A root object.

type Type

A type of a root object. If instance is not null, then its type is used instead.

memberPath string

A path to a member.

value object

A value to be set.

bindingFlags BindingFlags

Binding flags to find members.

Returns

bool

true in case of success, otherwise false if memberPath is null or empty or instance is null and type is null 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 object

A root object.

type Type

A type of a root object. If instance is not null, then its type is used instead.

memberPath string

A path to a member.

value object

A value to be set.

bindingFlags BindingFlags

Binding flags to find members.

Returns

bool

true in case of success, otherwise false if memberPath is null or empty or instance is null and type is null 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.