Type.GetType ("namespace.abClassName") বাতিল করে দেয়


216

এই কোড:

Type.GetType("namespace.a.b.ClassName")

আয় null

এবং আমার ব্যবহার হয়:

using namespace.a.b;

হালনাগাদ:

প্রকারটি বিদ্যমান, এটি একটি পৃথক শ্রেণীর লাইব্রেরিতে রয়েছে এবং আমার এটি স্ট্রিংয়ের নাম দিয়ে নেওয়া দরকার।


কীভাবে সমাবেশটি যোগ্য নাম পেতে পারেন সে সম্পর্কিত তথ্যের জন্য এই স্ট্যাকওভারফ্লো.com/ প্রশ্নগুলি / 441680/… দেখুন ।
পলিফুন

উত্তর:


244

Type.GetType("namespace.qualified.TypeName") শুধুমাত্র যখন mscorlib.dll বা বর্তমানে সঞ্চালক অ্যাসেমব্লিতে টাইপটি পাওয়া যায় কেবল তখনই কাজ করে।

যদি এই দুটি জিনিসই সত্য না হয় তবে আপনার একটি সমাবেশ-যোগ্য নাম প্রয়োজন :

Type.GetType("namespace.qualified.TypeName, Assembly.Name")

3
ধরণটি বিদ্যমান, এটি একটি পৃথক শ্রেণীর লাইব্রেরিতে রয়েছে এবং আমার এটি স্ট্রিং নাম দিয়ে নেওয়া দরকার
ওমু

25
কোনও সমাবেশ-যোগ্য নাম ব্যবহারের পরিবর্তে আপনি নামটি দিয়ে সমাবেশটি লোড করতে পারেন Assembly a = Assembly.Load("SomeLibrary");- এবং তারপরে সমাবেশ থেকে নামটি টাইপ করুন - Type t = a.GetType("namespace.a.b.ClassName");
কেনি এভিট

6
সম্ভবত আপনি typeof(SomeTypeInThatAssembly).Assembly.GetTypes().Where((t) => t.FullName == youFullName);কিছু ঝামেলা বাঁচাতে চান , শেষ পর্যন্ত
ফেলাইপ

ফেলিপের প্রতিক্রিয়া কেবলমাত্র আমিই কাজ করতে পারি।
রুডি স্কোগিনস

@Felype মন্তব্যের .FirstOrDefault () যোগ
লিয়ান্দ্রো

173

আপনি সমাবেশের যোগ্য নাম ছাড়াই টাইপটি পেতে পারেন তবে dll নামের সাথেও উদাহরণস্বরূপ:

Type myClassType = Type.GetType("TypeName,DllName");

আমার একই অবস্থা ছিল এবং এটি আমার পক্ষে কাজ করেছিল। আমার "ডাটামোডেল। কিউইউবজেক্ট" টাইপের একটি অবজেক্টের দরকার ছিল এবং "ডেটামোডেল" এর একটি রেফারেন্স ছিলাম তাই আমি টাইপটি নীচে পেয়েছি:

Type type = Type.GetType("DataModel.QueueObject,DataModel");

কমা পরে দ্বিতীয় স্ট্রিং হ'ল রেফারেন্স নাম (dll নাম)।


2
এটি কি 'কৌশল' বা বাস্তব পদ্ধতি? আমি এটি ডকুমেন্টেশনে খুঁজে পাচ্ছি না__-। যাইহোক, এটি আমার 1 সপ্তাহের ভোগান্তির শেষ! ধন্যবাদ
DnR

1
এটি একটি অনেক ক্লিনার সমাধান, আমি এটির কারণে কোনও অসুবিধা আছে কিনা তা দেখতে পছন্দ করব love
cossacksman

4
এই উত্তরে ব্যবহৃত ফর্মটি এমএসডিএন ব্যাকরণ অনুসারে একটি সম্পূর্ণ যোগ্য টাইপের নাম (তাই এটি কোনও কৌশল নয় )। ফর্মটি হ'ল NamespaceTypeName, AssemblyNameSpecযেখানে AssemblyNameSpecকোনও বৈশিষ্ট্য ছাড়াই সমাবেশের শনাক্তকারী। যদিও এই উত্তরটি মূলত স্বীকৃত হিসাবে একই, আমি ধরে নিই যে কিছু লোক এটি পছন্দ করে কারণ এটি সমাবেশের বৈশিষ্ট্যগুলির (যেমন Version, Culture PublicKeyToken) প্রবর্তিত কিছু "শব্দ" থেকে দূরে থাকে । ভাগ্যক্রমে, সম্পত্তিগুলি al চ্ছিক
মার্টিন লিভারেজ

নেস্টেড প্রকারের জন্য, আপনাকে কিছু করতে হবেAtlasKernelBusinessModel.AtlasConstants+ClaimCoverage+Status,AtlasKernelBusinessModel
টডডমো

ধন্যবাদ, এটি অ্যাপ_ কোড ফোল্ডারের জন্য কাজ করে। উদাহরণ: Type.GetType ("TypeName, App_Code");
বুড়াক কোরে বাল্কি

79

এই পদ্ধতিটি ব্যবহার করে দেখুন

 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সমর্থিত নয় বলে ইউডাব্লুপি-র পক্ষে কাজ করে না। কোনও বিকল্প সম্পর্কে নিশ্চিত নয়।
জেমস এম

25
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;
}

1
এটি দুর্দান্ত দেখাচ্ছে, তবে অন্যান্য সমাবেশের ধরণগুলি ব্যবহার করে জেনেরিকদের কী হবে?
ডেমেট্রিস লেপটোস

1
@ ডিমেট্রিসলিপটোস (আমি জানি মন্তব্যটি পুরানো - তবে অন্য ব্যক্তিরা এখনও আগ্রহী হতে পারেন): ইনড ইনডেক্স = টাইপনাম.ইনডেক্সঅফ ('`') ব্যবহার করুন; যদি (সূচক> 0) {প্রকারের নাম = _typeName.Substring (0, সূচক + 2); } নোট করুন যে Tজেনেরিক ধরণেরটি বন্ধ করে দেওয়া হয়েছে।
বার্নহার্ড হিলার

25

যদি সমাবেশটি ASP.NET অ্যাপ্লিকেশন তৈরির অংশ হয় তবে আপনি বিল্ডম্যানেজার শ্রেণিটি ব্যবহার করতে পারেন:

using System.Web.Compilation
...
BuildManager.GetType(typeName, false);

1
এটি একটি দুর্দান্ত উত্তর এবং পৃষ্ঠায় উচ্চতর হওয়া উচিত। সমাবেশের মতো যোগ্য ধরণের নাম পাওয়ার পুরানো পদ্ধতির তুলনায় মোহনগুলির মতো কাজ করে এবং মৃত-সরল।
গ্রাহাম

এটি আশ্চর্যজনকভাবে সহজ এবং স্পট, আপনি প্রতিফলন অবজেক্টগুলির পারফরম্যান্স অপ্টিমাইজেশনে আমাকে সাহায্য করতে পারেন?
অলোক

15

যদি আপনার ক্লাসটি চলমান অসম্পূর্ণভাবে না থাকে তবে আপনাকে অবশ্যই কোয়ালিফাইড নাম দিতে হবে এবং এই কোডটি ক্লাসের যোগ্য নাম কীভাবে পাওয়া যায় তা দেখায়

string qualifiedName = typeof(YourClass).AssemblyQualifiedName;

এবং তারপরে আপনি যোগ্যতাসম্পন্ন নাম দিয়ে টাইপ করতে পারেন

Type elementType = Type.GetType(qualifiedName);

8

যদি এটি নেস্টেড টাইপ হয় তবে আপনি সম্ভবত কোনও রূপান্তর করতে ভুলে যাচ্ছেন। একটি +

নির্বিশেষে, typeof( T).FullNameআপনাকে কী বলা উচিত তা আপনাকে বলবে

সম্পাদনা: বিটিডব্লিউ ইউএসিং (যেমন আমি নিশ্চিত আপনি জানেন) সংকলনের সময় শুধুমাত্র সংকলকটির নির্দেশিকা এবং এটি এপিআই কলের সাফল্যে কোনও প্রভাব ফেলতে পারে না। (যদি আপনার কাছে প্রকল্প বা সমাবেশের উল্লেখ থাকে তবে এর সম্ভাব্য প্রভাব থাকতে পারে - সুতরাং তথ্যটি অকেজো নয়, এটি কেবল কিছু ফিল্টারিং নেয় ...)


আহারে! আপনি কি জানেন যে এই "+" - বাক্য গঠনটি ব্যাখ্যা করা হয়েছে?
রক্ষক এক

1
প্রোটেক্টরোন আমি এটিকে amazon.com/Essential-NET-Common-Language-Runtime/dp/0201734117 আইআইআরসি থেকে শিখেছি , তবে এটি কিছুটা তারিখের। আমি কীভাবে amazon.com/CLR-via-4th- ডেভেলপার- রেফারেন্স / dp/0735667454/… সকলের জন্য নিরবিচ্ছিন্নভাবে দরকারী বই হিসাবে সুপারিশ করতে পারি ? নেট ডেভস + এটি অন্তর্ভুক্ত করে? নীচের লাইনটি টাইপগুলির জন্য, সিএলআর কেবলমাত্র নামস্থান এবং নাম রয়েছে - একটি নেস্টেড টাইপটি সরাসরি সম্বোধনযোগ্য নয়। সুতরাং একটি ভাষা, যদি এটি একটি নেস্টেড ধরণের ধারণা থাকে তবে এটি তার প্রয়োজন অনুযায়ী করতে পারে (যদিও সাধারণভাবে বেশিরভাগ +
স্তরে

6

ব্যবহারকারীর নিয়ন্ত্রণে কোন ব্যবহারকারীর ডেটাবেসে নির্দিষ্ট হওয়া ব্যবহারের অ্যাক্সেস রয়েছে তার উপর নির্ভর করে আমি ব্যবহারকারী নিয়ন্ত্রণগুলি খুলছি। তাই আমি টাইপনামটি পেতে এই পদ্ধতিটি ব্যবহার করেছি ...

Dim strType As String = GetType(Namespace.ClassName).AssemblyQualifiedName.ToString
Dim obj As UserControl = Activator.CreateInstance(Type.GetType(strType))

সুতরাং এখন কেউ সেই বস্তুর উদাহরণ তৈরি করতে strType এ ফিরে আসা মানটি ব্যবহার করতে পারে।


একটি মহাকাব্য পুরানো বিষয় পুনরায় খোলার ... অভিনন্দন। তবে আমাকে আপনার উত্তরটি হ্রাস করতে হবে কারণ টিও আসলে টাইপনামটি জানে এবং সেখান থেকে টাইপটি পেতে চায়। বিটিডাব্লু: আপনি <c> গেটটাইপ (নেমস্পেস.ক্লাসনাম) </ c> দ্বারা কোন পদ্ধতিটি উল্লেখ করেন? যদি এর টাইপ.গেইটটাইপ এটি কেবলমাত্র আপনার বর্তমান এক্সিকিউটিভ অ্যাসেমব্লিং বা এমএসসিআরলিবের মধ্যে রয়েছে তবে কেবল তেমন কোনও উপায় নেই এই শর্তাবলী প্রযোজ্য।
হিমব্রুমবিয়ার

2
নিচে ভোটের জন্য ধন্যবাদ হিমব্র্যামবিয়ার আপনার মত লোকেরা যারা আমার অনুসন্ধানগুলি পোস্ট করতে আমাকে demotivates। আমি এখনও উন্নয়ন শিখছি এবং আমি অন্যকে সাহায্য করার চেষ্টা করছি। এবং এখন আপনি কি আমার প্রশ্নের উত্তরটি আশা করবেন? যাইহোক, আমি প্রশ্নের সঠিক উত্তর দিয়েছি। আমি যে ক্লাসটির একটি উদাহরণ তৈরি করছিলাম তা অন্য একটি প্রকল্পে বাস করে এবং যার কারণে একটিকে এসেম্বলি কোয়ালিফাইড নাম ব্যবহার করতে হয়। সুতরাং দয়া করে ডাউনটিভোট করার আগে বাকি মন্তব্যগুলি পড়ুন। "ধরণটি বিদ্যমান, এটি একটি পৃথক শ্রেণীর গ্রন্থাগারে রয়েছে এবং আমার এটি স্ট্রিংয়ের নাম দ্বারা নেওয়া দরকার - ওমু"
স্টিফান

6

যখন আমার কেবল ক্লাসের নাম থাকবে আমি এটি ব্যবহার করি:

Type obj = AppDomain.CurrentDomain.GetAssemblies().SelectMany(t => t.GetTypes()).Where(t => String.Equals(t.Name, _viewModelName, StringComparison.Ordinal)).First();

5

যেমন টাইপ.গেটটাইপ (স্ট্রিং) এর জন্য টাইপ.অ্যাস্পেসকুয়ালাইফাইড নাম প্রয়োজন আপনার এসেম্বলি.ক্রিয়েটকুয়ালাইফাইড নাম (স্ট্রিং, স্ট্রিং) ব্যবহার করা উচিত ।

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 এ থাকে তবে টাইপটির নামটি তার নেমস্পেসের দ্বারা সরবরাহের জন্য যথেষ্ট।


4

যদি সমাবেশটি উল্লেখ করা হয় এবং শ্রেণি দৃশ্যমান হয়:

typeof(namespace.a.b.ClassName)

গেটটাইপ নাল ফেরায় কারণ টাইপটি খুঁজে পাওয়া যায়নি, টাইপফের সাথে সংকলকটি আপনাকে ত্রুটিটি সনাক্ত করতে সহায়তা করতে পারে।


ধরণটি বিদ্যমান, এটি একটি পৃথক শ্রেণীর গ্রন্থাগারে, এবং আমার এটি স্ট্রিং নাম দিয়ে নেওয়া দরকার
ওমু

4

পুরো টাইপের নাম ব্যবহার করে চেষ্টা করুন যাতে সমাবেশ সম্পর্কিত তথ্য অন্তর্ভুক্ত থাকে:

string typeName = @"MyCompany.MyApp.MyDomain.MyClass, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null";
Type myClassType = Type.GetType(typeName);

আমার একই অবস্থা ছিল যখন আমি আলাদা নাম্বারটিতে ক্লাসের ধরণ পেতে কেবল নামস্থান স্পেস.ক্লাসনামটি ব্যবহার করি এবং এটি কার্যকর হয় না। উপরের মতো আমি যখন টাইপ স্ট্রিংয়ে সমাবেশের তথ্য অন্তর্ভুক্ত করেছি কেবল তখনই কাজ করে worked


3

নিশ্চিত হয়ে নিন যে কমাটি সম্পূর্ণরূপে যোগ্যতাসম্পন্ন নামের পরে রয়েছে

typeof(namespace.a.b.ClassName, AssemblyName)

এই অভ্যাস কাজ হিসাবে

typeof(namespace.a.b.ClassName ,AssemblyName)

আমি এই কয়েক দিন স্টম্প্পড ছিল


2

আমার জন্য, একটি "+" কী ছিল! এটি আমার ক্লাস (এটি নেস্টেড একটি):

namespace PortalServices
{
public class PortalManagement : WebService
{
    public class Merchant
    {}
}
}

এবং কোডের এই লাইনটি কাজ করেছে:

Type type = Type.GetType("PortalServices.PortalManagement+Merchant");

1

উপরের এই সমাধানটি আমার কাছে সেরা বলে মনে হচ্ছে, তবে এটি আমার পক্ষে কার্যকর হয়নি, তাই আমি নীচে এটি করেছি:

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। যাইহোক, নিখুঁত পাথের প্রয়োজন নেই কারণ এটি এসএসডিএন থেকে এসেম্বলকিউলিফাইড নেমগুলিতে মনে হয়


0

আমি প্রতারিত. যে ধরণের আমি (নাম দিয়ে) তৈরি করতে চাইছি সেগুলি সমস্তই আমার নিয়ন্ত্রণের মধ্যে থাকে, তাই আমি কেবল সমাবেশে ডেলিতে একটি স্ট্যাটিক পদ্ধতি রাখি যা একটি সাধারণ নাম নেয় এবং টাইপটি কল করে that প্রসঙ্গটি থেকে গেটটাইপ করে ফলাফলটি ফেরত দেয় ।

মূল উদ্দেশ্যটি ছিল যাতে কনফিগারেশন ডেটাতে টাইপটি নাম দ্বারা নির্দিষ্ট করা যায়। আমি তখন থেকে কোডটি পরিবর্তন করেছি যাতে ব্যবহারকারী প্রক্রিয়া করার জন্য একটি বিন্যাস নির্দিষ্ট করে দেয়। ফর্ম্যাট হ্যান্ডলার ক্লাসগুলি একটি ইন্টারফেস প্রয়োগ করে যা নির্ধারণ করে যে প্রকারটি নির্দিষ্ট ফর্ম্যাটটিকে পার্স করতে পারে কিনা। তারপরে আমি ইন্টারফেস প্রয়োগ করে এমন ধরণের সন্ধান করার জন্য প্রতিবিম্বটি ব্যবহার করি এবং বিন্যাসটি পরিচালনা করে এমন একটি সন্ধান করি। সুতরাং এখন কনফিগারেশন একটি বিন্যাসের নাম নির্দিষ্ট করে, একটি নির্দিষ্ট ধরণের নয়। প্রতিবিম্ব কোডটি সংলগ্ন dlls এবং লোডের দিকে নজর দিতে পারে, সেগুলিতে আমার কাছে এক ধরণের দরিদ্র লোকের প্লাগ-ইন আর্কিটেকচার রয়েছে।


হাই, আমি ভুল করে হ্রাস পেয়েছি, আপনার উত্তরটি সম্পাদনা করুন যাতে আমি এটিকে পূর্বাবস্থায় ফেরাতে পারি।
কলোবক্স্প
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.