C # 제네릭 목록 T의 유형을 얻는 방법? [복제]
이 질문에는 이미 답변이 있습니다.
나는 성찰 프로젝트를 진행하고 있는데 지금은 막혀 있습니다. List를 보유 할 수있는 "myclass"객체가있는 경우 myclass.SomList 속성이 비어있는 경우 아래 코드에서와 같이 유형을 얻는 방법을 아는 사람이 있습니까?
List<myclass> myList = dataGenerator.getMyClasses();
lbxObjects.ItemsSource = myList;
lbxObjects.SelectionChanged += lbxObjects_SelectionChanged;
private void lbxObjects_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
Reflect();
}
Private void Reflect()
{
foreach (PropertyInfo pi in lbxObjects.SelectedItem.GetType().GetProperties())
{
switch (pi.PropertyType.Name.ToLower())
{
case "list`1":
{
// This works if the List<T> contains one or more elements.
Type tTemp = GetGenericType(pi.GetValue(lbxObjects.SelectedItem, null));
// but how is it possible to get the Type if the value is null?
// I need to be able to create a new object of the type the generic list expect.
// Type type = pi.getType?? // how to get the Type of the class inside List<T>?
break;
}
}
}
}
private Type GetGenericType(object obj)
{
if (obj != null)
{
Type t = obj.GetType();
if (t.IsGenericType)
{
Type[] at = t.GetGenericArguments();
t = at.First<Type>();
} return t;
}
else
{
return null;
}
}
Type type = pi.PropertyType;
if(type.IsGenericType && type.GetGenericTypeDefinition()
== typeof(List<>))
{
Type itemType = type.GetGenericArguments()[0]; // use this...
}
보다 일반적으로를 지원 IList<T>
하려면 인터페이스를 확인해야합니다.
foreach (Type interfaceType in type.GetInterfaces())
{
if (interfaceType.IsGenericType &&
interfaceType.GetGenericTypeDefinition()
== typeof(IList<>))
{
Type itemType = type.GetGenericArguments()[0];
// do something...
break;
}
}
내가 어떤 종류의 것으로 의심되는 객체가 주어지면 그것이 무엇인지IList<>
어떻게 알 수 있습니까?IList<>
여기에 용기있는 해결책이 있습니다. 테스트 할 실제 개체가 있다고 가정합니다 (가 Type
아님).
public static Type ListOfWhat(Object list)
{
return ListOfWhat2((dynamic)list);
}
private static Type ListOfWhat2<T>(IList<T> list)
{
return typeof(T);
}
사용법 예 :
object value = new ObservableCollection<DateTime>();
ListOfWhat(value).Dump();
인쇄물
typeof(DateTime)
Marc's answer is the approach I use for this, but for simplicity (and a friendlier API?) you can define a property in the collection base class if you have one such as:
public abstract class CollectionBase<T> : IList<T>
{
...
public Type ElementType
{
get
{
return typeof(T);
}
}
}
I have found this approach useful, and is easy to understand for any newcomers to generics.
Given an object which I suspect to be some kind of IList<>
, how can I determine of what it's an IList<>
?
Here's a reliable solution. My apologies for length - C#'s introspection API makes this suprisingly difficult.
/// <summary>
/// Test if a type implements IList of T, and if so, determine T.
/// </summary>
public static bool TryListOfWhat(Type type, out Type innerType)
{
Contract.Requires(type != null);
var interfaceTest = new Func<Type, Type>(i => i.IsGenericType && i.GetGenericTypeDefinition() == typeof(IList<>) ? i.GetGenericArguments().Single() : null);
innerType = interfaceTest(type);
if (innerType != null)
{
return true;
}
foreach (var i in type.GetInterfaces())
{
innerType = interfaceTest(i);
if (innerType != null)
{
return true;
}
}
return false;
}
Example usage:
object value = new ObservableCollection<int>();
Type innerType;
TryListOfWhat(value.GetType(), out innerType).Dump();
innerType.Dump();
Returns
True
typeof(Int32)
참고URL : https://stackoverflow.com/questions/1043755/c-sharp-generic-list-t-how-to-get-the-type-of-t
'IT story' 카테고리의 다른 글
내가 가지고있는 Symfony 버전을 어떻게 알 수 있습니까? (0) | 2020.08.07 |
---|---|
Windows 붙여 넣기와 VIM Ctrl-V 충돌 (0) | 2020.08.07 |
그룹화 된 스타일로 UITableView에서 셀의 너비를 설정하는 방법 (0) | 2020.08.07 |
Perl에 파일이 있는지 어떻게 확인할 수 있습니까? (0) | 2020.08.07 |
버튼을 생성하지 않고 pinterest에서 "고정"링크 (0) | 2020.08.07 |