C# 如何添加到列表<;字符串>;可以是单个字符串或字符串列表的对象

C# 如何添加到列表<;字符串>;可以是单个字符串或字符串列表的对象,c#,reflection,C#,Reflection,看起来python的问题已经解决了,但C#的问题还没有解决,因为我是python文盲,而且是C#的新手,所以下面是: 我试图根据枚举参数(类型)从类(任务/任务)的实例中获取属性,并将该属性添加到列表中。棘手的是,我不确定属性值是字符串还是字符串列表 所以,一般来说,我看到的是: PropertyInfo propertyInfo = typeof(Task).GetProperty(type.ToString()); List<string> values = new List&l

看起来python的问题已经解决了,但C#的问题还没有解决,因为我是python文盲,而且是C#的新手,所以下面是:

我试图根据枚举参数(类型)从类(任务/任务)的实例中获取属性,并将该属性添加到列表中。棘手的是,我不确定属性值是字符串还是字符串列表

所以,一般来说,我看到的是:

PropertyInfo propertyInfo = typeof(Task).GetProperty(type.ToString());
List<string> values = new List<string>();
我的选项是什么?

您可以使用它来检查属性的类型,或者您可以将值作为
对象
获取,然后从那里开始:

List<string> values = new List<string>();
object value = propertyInfo.GetValue(task, null);
if (value is string)
{
    values.Add((string) value);
}
else if (value is IEnumerable<string>)
{
    values.AddRange((IEnumerable<string>) value);
}
else
{
    // Do whatever you want if the type doesn't match...
}
请注意,如果该属性是任何其他类型的字符串序列,而不仅仅是
列表
,则此操作有效。它还会复制该列表,以便任何进一步的更改都不会影响该属性所引用的现有列表。如果需要,请进行调整:)

Lee的回答提醒了我一点——如果它是一个
字符串
属性,具有
null
值,并且您想要一个包含单个null元素的列表,那么您需要使用
PropertyType
。例如:

if (propertyInfo.PropertyType == typeof(string))
{
    values.Add((string) propertyInfo.GetValue(task, null));
}

当你说它复制列表时,你指的是AddRange吗?顺便说一句,第二个示例values.AddRange:)@Ulises:是的,我指的是
AddRange
。我必须问一下,为什么要使用反射从任务实例中提取数据?“你当然可以直接使用它的属性?”阿什利罗斯问得好。我试图最小化代码的长度/复杂性,并使代码能够处理任务类中的更改(添加/删除属性)。啊,我以为您使用的是,而不是您自己的自定义任务类。尽管如此,我还是会对这样的动态代码保持警惕,因为您将失去C#的类型检查等的所有好处。;很少有人真的需要它。不,它们是一样的,
null
引用不是
字符串。两个版本都不会向列表添加
null
引用。
List<string> values = new List<string>();
object value = propertyInfo.GetValue(task, null);
string stringValue = value as string;
if (stringValue != null)
{
    values.Add(stringValue);
}
else
{
    IEnumerable<string> valueSequence = value as IEnumerable<string>;
    if (valueSequence != null)
    {
        values.AddRange(valueSequence);
    }
    else
    {
        // Do whatever you want if the type doesn't match...
    } 
}
if (propertyInfo.PropertyType == typeof(string))
{
    values.Add((string) propertyInfo.GetValue(task, null));
}
PropertyInfo propertyInfo = typeof(Task).GetProperty(type.ToString());
List<string> values = new List<string>();

object p = propertyInfo.GetValue(task, null);
if(p is string)
{
    values.Add((string)p);
}
else if(p is List<string>)
{
    values.AddRange((List<string>)p);
}
string str = p as string;
List<string> list = p as List<string>;

if(str != null)
{
    values.Add(str);
}
else if(list != null)
{
    values.AddRange(list);
}