Я уже сделал нечто подобное.Отражение может быть вашим лучшим (и единственным) вариантом, если вам нужен общий подход.
// Just an holder for InArgument informations
class InArgumentInfo
{
public string InArgumentName { get; set; }
public string InArgumentDescription { get; set; }
public bool InArgumentIsRequired { get; set; }
}
static ICollection<InArgumentInfo> GetInArgumentsInfos(Activity activity)
{
var properties = activity.GetType()
.GetProperties()
.Where(p => typeof(InArgument).IsAssignableFrom(p.PropertyType))
.ToList();
var argumentsCollection = new Collection<InArgumentInfo>();
foreach (var property in properties)
{
var descAttribute = property
.GetCustomAttributes(false)
.OfType<DescriptionAttribute>()
.FirstOrDefault();
string description = descAttribute != null && !string.IsNullOrEmpty(descAttribute.Description) ?
descAttribute.Description :
string.Empty;
bool isRequired = property
.GetCustomAttributes(false)
.OfType<RequiredArgumentAttribute>()
.Any();
argumentsCollection.Add(new InArgumentInfo
{
InArgumentName = property.Name,
InArgumentDescription = description,
InArgumentIsRequired = isRequired
});
}
return argumentsCollection;
}
Таким образом, вы можете не только получить имя аргумента, но и другую информацию, хранящуюся в атрибутах аргумента.Например, я хочу дать аргументу удобное для пользователя имя с помощью атрибута [Description] (например, вместо MyPropertyName пользователь видит «Имя моего свойства»).
Примечание : если вы можете убедиться, что ваша деятельность является ActivityBuilder или DynamicActivity , они оба имеют Свойства , которые вы можете использовать, но принцип тот же.