এই কোড:
Type.GetType("namespace.a.b.ClassName")
আয় null
।
এবং আমার ব্যবহার হয়:
using namespace.a.b;
হালনাগাদ:
প্রকারটি বিদ্যমান, এটি একটি পৃথক শ্রেণীর লাইব্রেরিতে রয়েছে এবং আমার এটি স্ট্রিংয়ের নাম দিয়ে নেওয়া দরকার।
এই কোড:
Type.GetType("namespace.a.b.ClassName")
আয় null
।
এবং আমার ব্যবহার হয়:
using namespace.a.b;
হালনাগাদ:
প্রকারটি বিদ্যমান, এটি একটি পৃথক শ্রেণীর লাইব্রেরিতে রয়েছে এবং আমার এটি স্ট্রিংয়ের নাম দিয়ে নেওয়া দরকার।
উত্তর:
Type.GetType("namespace.qualified.TypeName")
শুধুমাত্র যখন mscorlib.dll বা বর্তমানে সঞ্চালক অ্যাসেমব্লিতে টাইপটি পাওয়া যায় কেবল তখনই কাজ করে।
যদি এই দুটি জিনিসই সত্য না হয় তবে আপনার একটি সমাবেশ-যোগ্য নাম প্রয়োজন :
Type.GetType("namespace.qualified.TypeName, Assembly.Name")
Assembly a = Assembly.Load("SomeLibrary");
- এবং তারপরে সমাবেশ থেকে নামটি টাইপ করুন - Type t = a.GetType("namespace.a.b.ClassName");
।
typeof(SomeTypeInThatAssembly).Assembly.GetTypes().Where((t) => t.FullName == youFullName);
কিছু ঝামেলা বাঁচাতে চান , শেষ পর্যন্ত
আপনি সমাবেশের যোগ্য নাম ছাড়াই টাইপটি পেতে পারেন তবে dll নামের সাথেও উদাহরণস্বরূপ:
Type myClassType = Type.GetType("TypeName,DllName");
আমার একই অবস্থা ছিল এবং এটি আমার পক্ষে কাজ করেছিল। আমার "ডাটামোডেল। কিউইউবজেক্ট" টাইপের একটি অবজেক্টের দরকার ছিল এবং "ডেটামোডেল" এর একটি রেফারেন্স ছিলাম তাই আমি টাইপটি নীচে পেয়েছি:
Type type = Type.GetType("DataModel.QueueObject,DataModel");
কমা পরে দ্বিতীয় স্ট্রিং হ'ল রেফারেন্স নাম (dll নাম)।
NamespaceTypeName, AssemblyNameSpec
যেখানে AssemblyNameSpec
কোনও বৈশিষ্ট্য ছাড়াই সমাবেশের শনাক্তকারী। যদিও এই উত্তরটি মূলত স্বীকৃত হিসাবে একই, আমি ধরে নিই যে কিছু লোক এটি পছন্দ করে কারণ এটি সমাবেশের বৈশিষ্ট্যগুলির (যেমন Version
, Culture
PublicKeyToken
) প্রবর্তিত কিছু "শব্দ" থেকে দূরে থাকে । ভাগ্যক্রমে, সম্পত্তিগুলি al চ্ছিক ।
AtlasKernelBusinessModel.AtlasConstants+ClaimCoverage+Status,AtlasKernelBusinessModel
এই পদ্ধতিটি ব্যবহার করে দেখুন
public static Type GetType(string typeName)
{
var type = Type.GetType(typeName);
if (type != null) return type;
foreach (var a in AppDomain.CurrentDomain.GetAssemblies())
{
type = a.GetType(typeName);
if (type != null)
return type;
}
return null ;
}
AppDomain
সমর্থিত নয় বলে ইউডাব্লুপি-র পক্ষে কাজ করে না। কোনও বিকল্প সম্পর্কে নিশ্চিত নয়।
Dictionary<string, Type> typeCache;
...
public static bool TryFindType(string typeName, out Type t) {
lock (typeCache) {
if (!typeCache.TryGetValue(typeName, out t)) {
foreach (Assembly a in AppDomain.CurrentDomain.GetAssemblies()) {
t = a.GetType(typeName);
if (t != null)
break;
}
typeCache[typeName] = t; // perhaps null
}
}
return t != null;
}
T
জেনেরিক ধরণেরটি বন্ধ করে দেওয়া হয়েছে।
যদি সমাবেশটি ASP.NET অ্যাপ্লিকেশন তৈরির অংশ হয় তবে আপনি বিল্ডম্যানেজার শ্রেণিটি ব্যবহার করতে পারেন:
using System.Web.Compilation
...
BuildManager.GetType(typeName, false);
যদি আপনার ক্লাসটি চলমান অসম্পূর্ণভাবে না থাকে তবে আপনাকে অবশ্যই কোয়ালিফাইড নাম দিতে হবে এবং এই কোডটি ক্লাসের যোগ্য নাম কীভাবে পাওয়া যায় তা দেখায়
string qualifiedName = typeof(YourClass).AssemblyQualifiedName;
এবং তারপরে আপনি যোগ্যতাসম্পন্ন নাম দিয়ে টাইপ করতে পারেন
Type elementType = Type.GetType(qualifiedName);
যদি এটি নেস্টেড টাইপ হয় তবে আপনি সম্ভবত কোনও রূপান্তর করতে ভুলে যাচ্ছেন। একটি +
নির্বিশেষে, typeof( T).FullName
আপনাকে কী বলা উচিত তা আপনাকে বলবে
সম্পাদনা: বিটিডব্লিউ ইউএসিং (যেমন আমি নিশ্চিত আপনি জানেন) সংকলনের সময় শুধুমাত্র সংকলকটির নির্দেশিকা এবং এটি এপিআই কলের সাফল্যে কোনও প্রভাব ফেলতে পারে না। (যদি আপনার কাছে প্রকল্প বা সমাবেশের উল্লেখ থাকে তবে এর সম্ভাব্য প্রভাব থাকতে পারে - সুতরাং তথ্যটি অকেজো নয়, এটি কেবল কিছু ফিল্টারিং নেয় ...)
+
ব্যবহারকারীর নিয়ন্ত্রণে কোন ব্যবহারকারীর ডেটাবেসে নির্দিষ্ট হওয়া ব্যবহারের অ্যাক্সেস রয়েছে তার উপর নির্ভর করে আমি ব্যবহারকারী নিয়ন্ত্রণগুলি খুলছি। তাই আমি টাইপনামটি পেতে এই পদ্ধতিটি ব্যবহার করেছি ...
Dim strType As String = GetType(Namespace.ClassName).AssemblyQualifiedName.ToString
Dim obj As UserControl = Activator.CreateInstance(Type.GetType(strType))
সুতরাং এখন কেউ সেই বস্তুর উদাহরণ তৈরি করতে strType এ ফিরে আসা মানটি ব্যবহার করতে পারে।
যেমন টাইপ.গেটটাইপ (স্ট্রিং) এর জন্য টাইপ.অ্যাস্পেসকুয়ালাইফাইড নাম প্রয়োজন আপনার এসেম্বলি.ক্রিয়েটকুয়ালাইফাইড নাম (স্ট্রিং, স্ট্রিং) ব্যবহার করা উচিত ।
string typeName = "MyNamespace.MyClass"; // Type.FullName
string assemblyName = "MyAssemblyName"; // MyAssembly.FullName or MyAssembly.GetName().Name
string assemblyQualifiedName = Assembly.CreateQualifiedName(assemblyName , typeName);
Type myClassType = Type.GetType(assemblyQualifiedName);
সংস্করণ, সংস্কৃতি এবং পাবলিককি টোকেনের প্রয়োজন হয় না assemblyName
এজন্য আপনি মাইঅ্যাস্পলাইশন.গেটনাম () ব্যবহার করতে পারেন।
টাইপ.গেটটাইপ (স্ট্রিং) সম্পর্কে :
টাইপটি যদি বর্তমানে সম্পাদনকারী অ্যাসেমব্লিতে বা Mscorlib.dll এ থাকে তবে টাইপটির নামটি তার নেমস্পেসের দ্বারা সরবরাহের জন্য যথেষ্ট।
যদি সমাবেশটি উল্লেখ করা হয় এবং শ্রেণি দৃশ্যমান হয়:
typeof(namespace.a.b.ClassName)
গেটটাইপ নাল ফেরায় কারণ টাইপটি খুঁজে পাওয়া যায়নি, টাইপফের সাথে সংকলকটি আপনাকে ত্রুটিটি সনাক্ত করতে সহায়তা করতে পারে।
পুরো টাইপের নাম ব্যবহার করে চেষ্টা করুন যাতে সমাবেশ সম্পর্কিত তথ্য অন্তর্ভুক্ত থাকে:
string typeName = @"MyCompany.MyApp.MyDomain.MyClass, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null";
Type myClassType = Type.GetType(typeName);
আমার একই অবস্থা ছিল যখন আমি আলাদা নাম্বারটিতে ক্লাসের ধরণ পেতে কেবল নামস্থান স্পেস.ক্লাসনামটি ব্যবহার করি এবং এটি কার্যকর হয় না। উপরের মতো আমি যখন টাইপ স্ট্রিংয়ে সমাবেশের তথ্য অন্তর্ভুক্ত করেছি কেবল তখনই কাজ করে worked
উপরের এই সমাধানটি আমার কাছে সেরা বলে মনে হচ্ছে, তবে এটি আমার পক্ষে কার্যকর হয়নি, তাই আমি নীচে এটি করেছি:
AssemblyName assemblyName = AssemblyName.GetAssemblyName(HttpContext.Current.Server.MapPath("~\\Bin\\AnotherAssembly.dll"));
string typeAssemblyQualifiedName = string.Join(", ", "MyNamespace.MyType", assemblyName.FullName);
Type myType = Type.GetType(typeAssemblyQualifiedName);
পূর্বশর্ত হ'ল আপনি সমাবেশের পথ জানেন। আমার ক্ষেত্রে আমি এটি জানি কারণ এটি অন্য একটি অভ্যন্তরীণ প্রকল্প থেকে নির্মিত একটি অ্যাসেমব্লী এবং এটি আমাদের প্রকল্পের বিন ফোল্ডারে অন্তর্ভুক্ত।
যদি বিষয়টি ভিজ্যুয়াল স্টুডিও 2013 ব্যবহার করে তবে এটির ক্ষেত্রে আমার লক্ষ্য .NET 4.0 ET এটি একটি এএসপি.এনইটি প্রকল্প, সুতরাং আমি এর মাধ্যমে নিখুঁত পথ পাচ্ছি HttpContext
। যাইহোক, নিখুঁত পাথের প্রয়োজন নেই কারণ এটি এসএসডিএন থেকে এসেম্বলকিউলিফাইড নেমগুলিতে মনে হয়
আমি প্রতারিত. যে ধরণের আমি (নাম দিয়ে) তৈরি করতে চাইছি সেগুলি সমস্তই আমার নিয়ন্ত্রণের মধ্যে থাকে, তাই আমি কেবল সমাবেশে ডেলিতে একটি স্ট্যাটিক পদ্ধতি রাখি যা একটি সাধারণ নাম নেয় এবং টাইপটি কল করে that প্রসঙ্গটি থেকে গেটটাইপ করে ফলাফলটি ফেরত দেয় ।
মূল উদ্দেশ্যটি ছিল যাতে কনফিগারেশন ডেটাতে টাইপটি নাম দ্বারা নির্দিষ্ট করা যায়। আমি তখন থেকে কোডটি পরিবর্তন করেছি যাতে ব্যবহারকারী প্রক্রিয়া করার জন্য একটি বিন্যাস নির্দিষ্ট করে দেয়। ফর্ম্যাট হ্যান্ডলার ক্লাসগুলি একটি ইন্টারফেস প্রয়োগ করে যা নির্ধারণ করে যে প্রকারটি নির্দিষ্ট ফর্ম্যাটটিকে পার্স করতে পারে কিনা। তারপরে আমি ইন্টারফেস প্রয়োগ করে এমন ধরণের সন্ধান করার জন্য প্রতিবিম্বটি ব্যবহার করি এবং বিন্যাসটি পরিচালনা করে এমন একটি সন্ধান করি। সুতরাং এখন কনফিগারেশন একটি বিন্যাসের নাম নির্দিষ্ট করে, একটি নির্দিষ্ট ধরণের নয়। প্রতিবিম্ব কোডটি সংলগ্ন dlls এবং লোডের দিকে নজর দিতে পারে, সেগুলিতে আমার কাছে এক ধরণের দরিদ্র লোকের প্লাগ-ইন আর্কিটেকচার রয়েছে।