in src/DurableTask.Core/TaskHubWorker.cs [654:696]
public TaskHubWorker AddTaskActivitiesFromInterfaceOrClass(Type interfaceOrClass, object activities, bool useFullyQualifiedMethodNames = false, bool includeInternalMethods = false)
{
if (interfaceOrClass.IsClass && interfaceOrClass.IsSealed)
{
throw new ArgumentException("Custom type cannot be a sealed class.");
}
if (!interfaceOrClass.IsInterface && !interfaceOrClass.IsClass)
{
throw new ArgumentException("Custom type must be an interface or non-sealed class.");
}
if (!interfaceOrClass.IsAssignableFrom(activities.GetType()))
{
throw new ArgumentException($"{activities.GetType().FullName} does not implement {interfaceOrClass.FullName}", nameof(activities));
}
if (includeInternalMethods && !interfaceOrClass.Assembly.GetCustomAttributes<InternalsVisibleToAttribute>().Where(attribute => string.Equals(attribute.AssemblyName, "DynamicProxyGenAssembly2")).Any())
{
throw new InvalidOperationException(
$"'{nameof(InternalsVisibleToAttribute)}' must be defined on assembly '{interfaceOrClass.Assembly.FullName}' when '{nameof(includeInternalMethods)}' is set to true.");
}
IEnumerable<MethodInfo> methods = includeInternalMethods switch
{
true => interfaceOrClass.GetMethods(BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.Instance | BindingFlags.NonPublic).Where(m => !m.IsFamily),
false => interfaceOrClass.GetMethods(BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.Instance),
};
foreach (MethodInfo methodInfo in methods)
{
TaskActivity taskActivity = new ReflectionBasedTaskActivity(activities, methodInfo);
ObjectCreator<TaskActivity> creator =
new NameValueObjectCreator<TaskActivity>(
NameVersionHelper.GetDefaultName(methodInfo, useFullyQualifiedMethodNames),
NameVersionHelper.GetDefaultVersion(methodInfo),
taskActivity);
this.activityManager.Add(creator);
}
return this;
}