[英]Determine whether field is of generic type or not
是否可以通過反射確定字段是否屬於泛型類型?
如果可能,怎么做?
我想我的問題不夠清楚,所以我現在正在編輯它。
編輯:
如果 a 將具有如下示例中定義的類型並且沒有Holder<T>
類型的實例,但只有通過System.Reflection.Assembly.GetTypes
和System.Reflection.FieldInfo
實例檢索到的System.Type
實例描述字段 _instance,如何我可以確定 _instance 字段是否屬於泛型類型
public class Holder<T>
{
private T _instance;
}
使用字段的 FieldInfo,如果您想知道字段本身是否是泛型類型,可以檢查 FieldType 屬性的 IsGenericType 屬性。
var info = type.GetField("myField",BindingFlags.Private);
if (info != null)
{
if (info.FieldType.IsGenericType)
{
Console.WriteLine( "The type of the field is generic" );
}
}
如果您要檢查該字段是否屬於通用 class 定義中的通用類型,那么您需要檢查 IsGenericParameter。
var info = type.GetField("myField",BindingFlags.Private);
if (info != null)
{
if (info.FieldType.IsGenericParameter)
{
Console.WriteLine( "The type of the field is the generic parameter of the class" );
}
}
當然,您可以將這些組合起來。 檢查該字段是否是泛型定義的 class 中類型的泛型,問題更大,但仍然可以完成。 您只需檢查泛型類型的類型參數,看看其中一個是否設置了 IsGenericParameter。 注意下面的例子只有一層深; 如果你想要一些全面的東西,你會想要定義一個方法並遞歸地使用它。
var info = type.GetField("myField",BindingFlags.Private);
if (info != null)
{
if (info.FieldType.IsGenericType)
{
foreach (var subType in info.FieldType.GetGenericArguments())
{
if (subType.IsGenericParameter)
{
Console.WriteLine( "The type of the field is generic" );
}
}
}
}
讓我以我理解的方式重新表述你的問題:
我有一個泛型類型,我想找出某個字段類型是否包含(其中一個)類型參數。 我怎么做?
如果要查明某個類型是否為泛型參數,可以使用IsGenericParameter
屬性。 這對T
返回true
,但對List<T>
不返回。 如果你願意,你可以使用遞歸:
bool ContainsGenericParameter(Type fieldType)
{
return fieldType.IsGenericParameter ||
fieldType.GetGenericArguments().Any(t => ContainsGenericParameter(t));
}
例如,如果您有這樣的類型:
public class Holder<T>
{
private T _t;
private int _int;
private List<T> _listT;
private List<int> _listInt;
}
這個查詢
typeof(Holder<>)
.GetFields(BindingFlags.NonPublic | BindingFlags.Instance)
.Select(f => new { f.Name, Generic = ContainsGenericParameter(f.FieldType) })
將返回如下內容:
Name Generic
_t True
_int False
_listT True
_listInt False
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.