using System.Collections.Generic;
using System.Threading.Tasks;
using System.Runtime.CompilerServices;
public static void Main()
var baseMetric = (BaseJobMetrics) Mock.Of<BaseJobMetrics>();
Console.WriteLine(baseMetric.jobId);
var example = new ServiceExample(new MetricService(baseMetric));
example.DoWorkExample1(5,2);
Console.WriteLine(baseMetric.jobId);
Console.WriteLine("----");
var regionSummaryJobMetric = (RegionSummaryJobMetrics) Mock.Of<RegionSummaryJobMetrics>();
Console.WriteLine(regionSummaryJobMetric.jobId);
Console.WriteLine(regionSummaryJobMetric.projectRunConfigurationId);
Console.WriteLine(regionSummaryJobMetric.hasZipSummaries);
example = new ServiceExample(new MetricService(regionSummaryJobMetric));
example.DoWorkExample1(5,2);
Console.WriteLine(regionSummaryJobMetric.jobId);
Console.WriteLine(regionSummaryJobMetric.projectRunConfigurationId);
Console.WriteLine(regionSummaryJobMetric.hasZipSummaries);
public interface BaseJobMetrics
public interface RegionSummaryJobMetrics : BaseJobMetrics
int projectRunConfigurationId { get; set; }
bool hasZipSummaries { get; set; }
public interface AnotherJobMetric : BaseJobMetrics
int projectRunConfigurationId { get; set; }
long zipSummariesCount { get; set; }
public class ServiceExample
public ServiceExample(MetricService service){
public void DoWorkExample1(int projectRunConfigurationId, int? zipSummariesCount = null)
_service.setProperty("projectRunConfigurationId", projectRunConfigurationId);
_service.setProperty("zipSummariesCount", zipSummariesCount ?? 0);
_service.setProperty("hasZipSummaries", zipSummariesCount.HasValue);
_service.setProperty("jobId", projectRunConfigurationId + (zipSummariesCount ?? 0));
public class MetricService
public MetricService(BaseJobMetrics baseJobMetrics)
_metric = baseJobMetrics;
public void setProperty(string propertyName, object value)
if(_metric.GetType().GetProperties().Any(p => p.Name == propertyName))
_metric.GetType().GetProperty(propertyName).SetValue(_metric, value);