public TaskHubWorker AddTaskActivitiesFromInterfaceOrClass()

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;
        }