উত্তর:
যদি আপনি এটি জেনেরিক ধরণের উদাহরণ হিসাবে পরীক্ষা করতে চান:
return list.GetType().IsGenericType;
আপনি যদি এটি জেনেরিক কিনা তা পরীক্ষা করতে চান List<T>
:
return list.GetType().GetGenericTypeDefinition() == typeof(List<>);
জন যেমন উল্লেখ করেছেন, এটি সঠিক ধরণের সমতুল্যতা পরীক্ষা করে। প্রত্যাবর্তনের false
অর্থ অগত্যা অর্থ list is List<T>
ফেরৎ হয় না false
(যেমন বস্তুটি কোনও List<T>
ভেরিয়েবলের জন্য বরাদ্দ করা যায় না )।
আমি ধরে নিলাম যে আপনি টাইপটি জেনেরিক কিনা তা কেবল জানতে চান না, তবে কোনও বিষয় যদি কোনও নির্দিষ্ট জেনেরিক ধরণের উদাহরণ, প্রকারের আর্গুমেন্টগুলি না জেনে।
দুর্ভাগ্যক্রমে, এটি মারাত্মক সহজ নয়। জেনেরিক টাইপটি যদি একটি শ্রেণি হয় তবে এটি খুব খারাপ নয় (যেমনটি এটি ক্ষেত্রে রয়েছে) তবে ইন্টারফেসের জন্য এটি আরও শক্ত। একটি শ্রেণীর জন্য কোড এখানে:
using System;
using System.Collections.Generic;
using System.Reflection;
class Test
{
static bool IsInstanceOfGenericType(Type genericType, object instance)
{
Type type = instance.GetType();
while (type != null)
{
if (type.IsGenericType &&
type.GetGenericTypeDefinition() == genericType)
{
return true;
}
type = type.BaseType;
}
return false;
}
static void Main(string[] args)
{
// True
Console.WriteLine(IsInstanceOfGenericType(typeof(List<>),
new List<string>()));
// False
Console.WriteLine(IsInstanceOfGenericType(typeof(List<>),
new string[0]));
// True
Console.WriteLine(IsInstanceOfGenericType(typeof(List<>),
new SubList()));
// True
Console.WriteLine(IsInstanceOfGenericType(typeof(List<>),
new SubList<int>()));
}
class SubList : List<string>
{
}
class SubList<T> : List<T>
{
}
}
সম্পাদনা: মন্তব্যগুলিতে উল্লিখিত হিসাবে, এটি ইন্টারফেসের জন্য কাজ করতে পারে:
foreach (var i in type.GetInterfaces())
{
if (i.IsGenericType && i.GetGenericTypeDefinition() == genericType)
{
return true;
}
}
আমার আশেপাশে কিছু বিশ্রী প্রান্তের মামলা থাকতে পারে এমন সন্দেহ আমার কাছে আছে তবে আমি এখনই এটি ব্যর্থ হতে পারি না।
List<T>
আপনি কোনও আকারে বা অন্যভাবে আঘাত করেছেন কিনা তা দেখতে পারেন । আপনি যদি ইন্টারফেস অন্তর্ভুক্ত করেন, এটি সত্যই জটিল।
IsInstanceOfGenericType
আপনি কোনও কল দিয়ে লুপটি প্রতিস্থাপন করতে পারবেন না ? IsAssignableFrom
==
আপনি ডায়নামিক অ্যালথৌথ ব্যবহার করে সংক্ষিপ্ত কোডটি ব্যবহার করতে পারেন এটি খাঁটি প্রতিবিম্বের চেয়ে ধীর হতে পারে:
public static class Extension
{
public static bool IsGenericList(this object o)
{
return IsGeneric((dynamic)o);
}
public static bool IsGeneric<T>(List<T> o)
{
return true;
}
public static bool IsGeneric( object o)
{
return false;
}
}
var l = new List<int>();
l.IsGenericList().Should().BeTrue();
var o = new object();
o.IsGenericList().Should().BeFalse();
এগুলি আমার দুটি পছন্দসই এক্সটেনশন পদ্ধতি যা জেনেরিক ধরণের চেকিংয়ের সর্বাধিক প্রান্তের কেসগুলি কভার করে:
সঙ্গে কাজ করে:
একটি ওভারলোড রয়েছে যা নির্দিষ্ট জেনেরিক প্রকারটি সত্য হয়ে গেলে 'আউট' করবে (নমুনাগুলির জন্য ইউনিট পরীক্ষা দেখুন):
public static bool IsOfGenericType(this Type typeToCheck, Type genericType)
{
Type concreteType;
return typeToCheck.IsOfGenericType(genericType, out concreteType);
}
public static bool IsOfGenericType(this Type typeToCheck, Type genericType, out Type concreteGenericType)
{
while (true)
{
concreteGenericType = null;
if (genericType == null)
throw new ArgumentNullException(nameof(genericType));
if (!genericType.IsGenericTypeDefinition)
throw new ArgumentException("The definition needs to be a GenericTypeDefinition", nameof(genericType));
if (typeToCheck == null || typeToCheck == typeof(object))
return false;
if (typeToCheck == genericType)
{
concreteGenericType = typeToCheck;
return true;
}
if ((typeToCheck.IsGenericType ? typeToCheck.GetGenericTypeDefinition() : typeToCheck) == genericType)
{
concreteGenericType = typeToCheck;
return true;
}
if (genericType.IsInterface)
foreach (var i in typeToCheck.GetInterfaces())
if (i.IsOfGenericType(genericType, out concreteGenericType))
return true;
typeToCheck = typeToCheck.BaseType;
}
}
(প্রাথমিক) কার্যকারিতাটি প্রদর্শন করার জন্য এখানে একটি পরীক্ষা দেওয়া হয়েছে:
[Test]
public void SimpleGenericInterfaces()
{
Assert.IsTrue(typeof(Table<string>).IsOfGenericType(typeof(IEnumerable<>)));
Assert.IsTrue(typeof(Table<string>).IsOfGenericType(typeof(IQueryable<>)));
Type concreteType;
Assert.IsTrue(typeof(Table<string>).IsOfGenericType(typeof(IEnumerable<>), out concreteType));
Assert.AreEqual(typeof(IEnumerable<string>), concreteType);
Assert.IsTrue(typeof(Table<string>).IsOfGenericType(typeof(IQueryable<>), out concreteType));
Assert.AreEqual(typeof(IQueryable<string>), concreteType);
}
return list.GetType().IsGenericType;