Skip to content

Commit cbf6356

Browse files
AdmiringWormpascalberger
authored andcommitted
(GH-17) Added simple class for wrapping other classes
1 parent 8a9d3f0 commit cbf6356

File tree

4 files changed

+124
-9
lines changed

4 files changed

+124
-9
lines changed

Cake.Issues.Recipe/Content/loader/AddinData.cake

Lines changed: 30 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ public class AddinData
1616
public IList<TypeInfo> _definedClasses = new List<TypeInfo>();
1717
private IList<MethodInfo> _definedMethods = new List<MethodInfo>();
1818

19-
public object CreateClass(string classTypeString, params object[] parameters)
19+
public ClassWrapper CreateClass(string classTypeString, params object[] parameters)
2020
{
2121
var possibleClass = _definedClasses.FirstOrDefault(c => string.Compare(c.Name, classTypeString, StringComparison.OrdinalIgnoreCase) == 0);
2222

@@ -28,7 +28,7 @@ public class AddinData
2828
return CreateClass(possibleClass, parameters);
2929
}
3030

31-
public object CreateClass(TypeInfo classType, params object[] parameters)
31+
public ClassWrapper CreateClass(TypeInfo classType, params object[] parameters)
3232
{
3333
parameters = parameters ?? new object[0];
3434
var constructors = classType.DeclaredConstructors.Where(c => c.IsPublic && !c.IsStatic && c.GetParameters().Length == parameters.Length);
@@ -51,10 +51,24 @@ public class AddinData
5151
throw new NullReferenceException("No valid constructor was found!");
5252
}
5353

54-
return constructor.Invoke(parameters ?? new object[0]);
54+
var result = constructor.Invoke(parameters ?? new object[0]);
55+
56+
return new ClassWrapper(result, this);
57+
}
58+
59+
public TType CallStaticMethod<TType>(string methodName, params object[] parameters)
60+
{
61+
var result = CallStaticMethod(methodName, parameters);
62+
63+
if (result.GetType().IsClass)
64+
{
65+
return (TType)result.ToActual();
66+
}
67+
68+
return (TType)result;
5569
}
5670

57-
public object CallStaticMethod(string methodName, params object[] parameters)
71+
public dynamic CallStaticMethod(string methodName, params object[] parameters)
5872
{
5973
parameters = TransformParameters(parameters);
6074

@@ -78,7 +92,14 @@ public class AddinData
7892
throw new NullReferenceException($"No method with the name '{methodName}' was found!");
7993
}
8094

81-
return method.Invoke(null, parameters);
95+
var result = method.Invoke(null, parameters);
96+
97+
if (result.GetType().IsClass)
98+
{
99+
return new ClassWrapper(result, this);
100+
}
101+
102+
return result;
82103
}
83104

84105
public object[] TransformParameters(params object[] parameters)
@@ -112,6 +133,10 @@ public class AddinData
112133
}
113134
}
114135
}
136+
else if (parameter is ClassWrapper wrapper)
137+
{
138+
value = wrapper.ToActual();
139+
}
115140

116141
newParameters.Add(value);
117142
}
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
using System.Reflection;
2+
3+
public sealed class ClassWrapper
4+
{
5+
private readonly Type _classType;
6+
private readonly object _concreteClass;
7+
private readonly AddinData _addinData;
8+
9+
public ClassWrapper(object concreteClass, AddinData addinData)
10+
{
11+
var classType = concreteClass.GetType();
12+
13+
if (!classType.IsClass)
14+
{
15+
throw new Exception($"The class {classType.Name} is not a class type!");
16+
}
17+
18+
_concreteClass = concreteClass;
19+
_addinData = addinData;
20+
_classType = classType;
21+
}
22+
23+
public object GetPropertyValue(string propertyName)
24+
{
25+
var property = _classType.GetProperty(propertyName, BindingFlags.GetProperty | BindingFlags.Public);
26+
27+
return property.GetValue(_concreteClass);
28+
}
29+
30+
public void SetPropertyValue(string propertyName, object value)
31+
{
32+
var property = _classType.GetProperty(propertyName, BindingFlags.SetProperty | BindingFlags.Public);
33+
value = _addinData.TransformParameters(value).First();
34+
if (property.PropertyType.IsEnum && !value.GetType().IsEnum)
35+
{
36+
value = Enum.Parse(property.PropertyType, value.ToString());
37+
}
38+
39+
property.SetValue(_concreteClass, value);
40+
}
41+
42+
public dynamic CallExtensionMethod(string methodName, params object[] parameters)
43+
{
44+
var newParameters = new List<object>();
45+
newParameters.Add(_concreteClass);
46+
newParameters.AddRange(_addinData.TransformParameters(parameters));
47+
48+
return _addinData.CallStaticMethod(methodName, newParameters.ToArray());
49+
}
50+
51+
public dynamic CallMethod(string methodName, params object[] parameters)
52+
{
53+
parameters = _addinData.TransformParameters(parameters);
54+
55+
var methods = _classType.GetMethods(BindingFlags.Instance | BindingFlags.Public).Where(m => string.Compare(m.Name, methodName, StringComparison.OrdinalIgnoreCase) == 0);
56+
MethodInfo method = null;
57+
58+
foreach (var m in methods.Where(m => m.GetParameters().Length == parameters.Length))
59+
{
60+
var methodParams = m.GetParameters();
61+
bool useMethod = AddinData.ParametersMatch(methodParams, parameters);
62+
63+
if (useMethod)
64+
{
65+
method = m;
66+
break;
67+
}
68+
}
69+
70+
if (method is null)
71+
{
72+
throw new NullReferenceException($"No method with the name '{methodName}' was found in the class '{_classType.Name}'");
73+
}
74+
75+
var result = method.Invoke(_concreteClass, parameters);
76+
77+
if (result.GetType().IsClass)
78+
{
79+
return new ClassWrapper(result, _addinData);
80+
}
81+
82+
return result;
83+
}
84+
85+
public object ToActual()
86+
{
87+
return _concreteClass;
88+
}
89+
}
Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
1-
#load ./AddinData.cake
1+
#load ./AddinData.cake
2+
#load ./ClassWrapper.cake

Cake.Issues.Recipe/Content/reporters/GenericReporterData.cake

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,9 @@ public class GenericReporterData : AddinData
2020
var settings = reporter.CallStaticMethod("FromEmbeddedTemplate", "HtmlDxDataGrid");
2121

2222
var theme = "DevExtremeTheme.MaterialBlueLight"; // Should be changed to be set on IssuesParametersReporting settings class.
23-
reporter.CallStaticMethod("WithOption", settings, "HtmlDxDataGridOption.Theme", theme);
23+
settings.CallExtensionMethod("WithOption", "HtmlDxDataGridOption.Theme", theme);
2424

25-
var issueFormat = (IIssueReportFormat)reporter.CallStaticMethod("GenericIssueReportFormat", context, settings);
25+
var issueFormat = reporter.CallStaticMethod<IIssueReportFormat>("GenericIssueReportFormat", context, settings);
2626

2727
return issueFormat;
2828
}
@@ -31,7 +31,7 @@ public class GenericReporterData : AddinData
3131
{
3232
var reporter = GetReporter(context);
3333

34-
var issueFormat = (IIssueReportFormat)reporter.CallStaticMethod("GenericIssueReportFormatFromFilePath", context, reportPath);
34+
var issueFormat = reporter.CallStaticMethod<IIssueReportFormat>("GenericIssueReportFormatFromFilePath", context, reportPath);
3535

3636
return issueFormat;
3737
}

0 commit comments

Comments
 (0)