Provides reflection functionality to search and invoke type members, search types, generate delegates etc.
https://www.nuget.org/packages/Heleonix.Reflection
var dt = DateTime.Now;
var info = Reflector.GetInfo(instance: dt, type: null, memberPath: "TimeOfDay.Negate");
// info[0].Name == "Negate";
// info[0].MemberType == MemberTypes.Property;
var path = Reflector.GetMemberPath<DateTime>(dt => dt.TimeOfDay.Negate());
// path: "TimeOfDay.Negate"
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();
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;
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;
var getter = Reflector.CreateGetter(dt => dt.Date.Month);
var value = getter(DateTime.Now);
// value == DateTime.Now.Date.Month;
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;
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;
-
Create a fork from the main repository
-
Implement whatever is needed
-
Create a Pull Request. Make sure the assigned Checks pass successfully. You can watch the progress in the PR: .NET GitHub workflows
-
Request review from the code owner
-
Once approved, merge your Pull Request via Squash and merge
IMPORTANT
While merging, enter a Conventional Commits commit message. This commit message will be used in automatically generated Github Release Notes and NuGet Release Notes -
Monitor the Release: .NET / NuGet GitHub workflow to make sure your changes are delivered successfully
-
In case of any issues, please contact [email protected]