Ответ 1
Вы ищете метод GetGenericTypeDefinition
:
MessageBox.Show(pi.PropertyType.GetGenericTypeDefinition().ToString());
Я отражаю свойство "Бла" его Тип - ICollection
public ICollection<string> Blah { get; set; }
private void button1_Click(object sender, RoutedEventArgs e)
{
var pi = GetType().GetProperty("Blah");
MessageBox.Show(pi.PropertyType.ToString());
}
Это дает мне (как и следовало ожидать!) ICollection<string>
...
Но на самом деле я хочу получить тип коллекции i.e. ICollection
(а не ICollection<string>
). Кто-нибудь знает, как я это сделаю?
Вы ищете метод GetGenericTypeDefinition
:
MessageBox.Show(pi.PropertyType.GetGenericTypeDefinition().ToString());
Вы хотите посмотреть GetGenericTypeDefinition, например:
List<String> strings=new List<string>();
Console.WriteLine(strings.GetType().GetGenericTypeDefinition());
foreach (var t in strings.GetType().GetGenericArguments())
{
Console.WriteLine(t);
}
Это выведет:
System.Collections.Generic.List`1 [Т]
System.String
У меня была схожая, но гораздо более сложная проблема... Я хотел бы определить, является ли тип назначаемым членам типа коллекции или членам типа массива динамически.
Итак, вот лучший способ: получить динамический тип члена или массив с помощью проверки, если тип добавляемого объекта можно назначить членам коллекции или членам массива:
List<IComparable> main = new List<IComparable>() { "str", "řetězec" };
IComparable[] main0 = new IComparable[] { "str", "řetězec" };
IEnumerable collection = (IEnumerable)main;
//IEnumerable collection = (IEnumerable)main0;
string str = (string) main[0];
if (collection.GetType().IsArray)
{
if (collection.GetType().GetElementType().IsAssignableFrom(str.GetType()))
{
MessageBox.Show("Type \"" + str.GetType() + "\" is ok!");
}
else
{
MessageBox.Show("Bad Collection Member Type");
}
}
else
{
if (collection.GetType().GenericTypeArguments[0].IsAssignableFrom(str.GetType()))
{
MessageBox.Show("Type \"" + str.GetType() + "\" is ok!");
}
else
{
MessageBox.Show("Bad Collection Member Type");
}
}