كيفية الحصول على التجمع (system.reflection.assembly) لنوع معين في .NET؟
-
16-09-2019 - |
سؤال
في .NET، نظرا لاسم النوع، هل هناك طريقة تخبرني فيها التجميع (مثيل النظام .Reflection.Assembly) تم تعريف هذا النوع؟
أفترض أن مشروعي لديه بالفعل إشارة إلى تلك الجمعية، فقط بحاجة إلى معرفة أي واحد هو.
المحلول
تجميعها. يفترض GetticeSemby أن لديك مثيل للنوع، ويتم اكتبه. تتحمل أن يكون لديك اسم نوع مؤهل بالكامل يتضمن اسم التجميع.
إذا كان لديك سوى اسم نوع الأساس، فأنت بحاجة إلى القيام بشيء ما مثل هذا:
public static String GetAssemblyNameContainingType(String typeName)
{
foreach (Assembly currentassembly in AppDomain.CurrentDomain.GetAssemblies())
{
Type t = currentassembly.GetType(typeName, false, true);
if (t != null) {return currentassembly.FullName;}
}
return "not found";
}
هذا يفترض أيضا أنه يتم الإعلان عن نوعك في الجذر. ستحتاج إلى توفير مساحة الاسم أو أرفق الأنواع بالاسم، أو تكرر بنفس الطريقة.
نصائح أخرى
Assembly.GetAssembly(typeof(System.Int32))
يستبدل System.Int32
مع أي نوع ما يحدث لتحتاج إليه. لأنه يقبل Type
المعلمة، يمكنك القيام بأي شيء بهذه الطريقة فقط، على سبيل المثال:
string GetAssemblyLocationOfObject(object o) {
return Assembly.GetAssembly(o.GetType()).Location;
}
لقد قمت بتكييف الإجابة المقبولة لأغراضي الخاصة (إرجاع كائن التجميع بدلا من اسم التجميع)، وقم بإعادة تعيين رمز VB.NET و LINQ:
Public Function GetAssemblyForType(typeName As String) As Assembly
Return AppDomain.CurrentDomain.GetAssemblies.FirstOrDefault(Function(a) a.GetType(typeName, False, True) IsNot Nothing)
End Function
أنا فقط تقاسمها هنا إذا كان أي شخص آخر يرغب في حل LinQy للإجابة المقبولة.
Type.GetType(typeNameString).Assembly
إذا كنت تستطيع استخدامه، فإن هذا بناء الجملة هو أقصر / أنظف:
typeof(int).Assembly