اندازهی قلم متن
تخمین مدت زمان مطالعهی مطلب:
دو دقیقه
API کار با امکانات Reflection نیز در NET Core. نسبت به نگارش کامل دات نت، دارای تغییراتی است که در ادامه مهمترینهای آنها را بررسی خواهیم کرد.
پیشنیازهای کار با Reflection در NET Core.
ابتدا نیاز است اسمبلی System.Reflection به قسمت وابستگیهای فایل project.json اضافه شود:
البته اگر وابستگی دیگری در فایل project.json، این وابستگی را پیشتر مورد استفاده قرار داده باشد، نیازی به ذکر مجدد آن نیست. برای این منظور میتوان فایل project.lock.json را جهت یافتن مدخل System.Reflection بررسی کرد. اگر این مدخل در فایل lock موجود بود، توسط پروژه قابل دسترسی است و نیازی به ذکر صریح آن نخواهد بود.
پس از این مورد، ذکر فضای نام System.Reflection را در ابتدای کدها نیز فراموش نکنید. همین مورد بسیاری از خطاهای انتقال کدها را بدون تغییری برطرف میکند:
نوشتن کدهای شرطی، برای کامپایل یک کد، مخصوص فریم ورکهای مختلف
در کدهای سی شارپ میتوان توسط if# و else#، کامپایلر را جهت استفاده یا عدم استفادهی کدهای نوشته شده، راهنمایی کرد. برای این منظور در NET Core.، به فایل project.json مراجعه کرده و ثابت دلخواهی را به نام COREFX به قسمت buildOptions اضافه میکنیم.
پس از تعریف ثابت COREFX، اکنون نحوهی استفادهی از آن به صورت ذیل خواهد بود:
از این روش میتوان برای کامپایل یک فایل کد cs، جهت فریم ورکهای مختلف استفاده کرد. در حالت فوق، کامپایلر فقط قسمت if# را پردازش کرده و از قسمت else# به طور کامل صرفنظر خواهد کرد.
اضافه شدن متدهای GetMethodInfo و GetTypeInfo
بسیاری از امکانات System.Type نگارش کامل دات نت به TypeInfo در NET Core. منتقل شدهاند. برای مثال بجای کد پیشین
اینبار باید نوشت
و یا نمونهی if/else دار آن به صورت ذیل خواهد بود:
در اینجا قسمت if جهت NET Core. نوشته شدهاست و قسمت else برای نگارش کامل دات نت قابل استفاده خواهد بود.
یافتن اسمبلی جاری
در NET Core. متد GetExecutingAssembly حذف شدهاست و باید ابتدا نوع کلاس جاری را یافت و سپس توسط GetTypeInfo به Assembly آن دسترسی یافت:
خلاصهی بحث
برای تبدیل کدهای مبتنی بر Reflection موجود، ابتدا از وجود وابستگی System.Reflection اطمینان حاصل کرده، فضای نام آنرا الحاق و در موارد جزئی نیاز است از متد GetTypeInfo برای دسترسی به خواص API قبلی استفاده کرد.
پیشنیازهای کار با Reflection در NET Core.
ابتدا نیاز است اسمبلی System.Reflection به قسمت وابستگیهای فایل project.json اضافه شود:
"dependencies": { "System.Reflection": "4.3.0" },
پس از این مورد، ذکر فضای نام System.Reflection را در ابتدای کدها نیز فراموش نکنید. همین مورد بسیاری از خطاهای انتقال کدها را بدون تغییری برطرف میکند:
using System.Reflection;
نوشتن کدهای شرطی، برای کامپایل یک کد، مخصوص فریم ورکهای مختلف
در کدهای سی شارپ میتوان توسط if# و else#، کامپایلر را جهت استفاده یا عدم استفادهی کدهای نوشته شده، راهنمایی کرد. برای این منظور در NET Core.، به فایل project.json مراجعه کرده و ثابت دلخواهی را به نام COREFX به قسمت buildOptions اضافه میکنیم.
"buildOptions": { "define": [ "COREFX" ] },
#if COREFX // corefx codes #else // other frameworks #endif
اضافه شدن متدهای GetMethodInfo و GetTypeInfo
بسیاری از امکانات System.Type نگارش کامل دات نت به TypeInfo در NET Core. منتقل شدهاند. برای مثال بجای کد پیشین
var members = obj.GetType().GetMembers();
var members = obj.GetType().GetTypeInfo().GetMembers();
#if COREFX toType.GetTypeInfo().IsGenericType #else toType.IsGenericType #endif
یافتن اسمبلی جاری
در NET Core. متد GetExecutingAssembly حذف شدهاست و باید ابتدا نوع کلاس جاری را یافت و سپس توسط GetTypeInfo به Assembly آن دسترسی یافت:
#if COREFX return typeof(MyClassName).GetTypeInfo().Assembly; #else return System.Reflection.Assembly.GetExecutingAssembly(); #endif
خلاصهی بحث
برای تبدیل کدهای مبتنی بر Reflection موجود، ابتدا از وجود وابستگی System.Reflection اطمینان حاصل کرده، فضای نام آنرا الحاق و در موارد جزئی نیاز است از متد GetTypeInfo برای دسترسی به خواص API قبلی استفاده کرد.