सी # में प्रतिबिंब के माध्यम से एक नामस्थान में सभी कक्षाएं कैसे मिलती हैं?
सी # में प्रतिबिंब के माध्यम से एक नामस्थान में सभी कक्षाएं कैसे मिलती हैं?
जवाबों:
namespace
वर्तमान विधानसभा में निर्दिष्ट कोड में वर्गों के नाम निम्नलिखित हैं ।
जैसा कि अन्य लोगों ने बताया है, एक नेमस्पेस अलग-अलग मॉड्यूलों के बीच बिखर सकता है, इसलिए आपको पहले असेंबली की एक सूची प्राप्त करने की आवश्यकता है।
string nspace = "...";
var q = from t in Assembly.GetExecutingAssembly().GetTypes()
where t.IsClass && t.Namespace == nspace
select t;
q.ToList().ForEach(t => Console.WriteLine(t.Name));
जैसा कि फ्लाईस्वाट कहता है, आपके पास कई असेंबली (उदाहरण के लिए System.Collections.Generic
) में एक ही नाम स्थान हो सकता है । यदि आप पहले से लोड नहीं हैं, तो आपको उन सभी विधानसभाओं को लोड करना होगा। तो एक पूर्ण उत्तर के लिए:
AppDomain.CurrentDomain.GetAssemblies()
.SelectMany(t => t.GetTypes())
.Where(t => t.IsClass && t.Namespace == @namespace)
यह तब तक काम करना चाहिए जब तक आप अन्य डोमेन की कक्षाएं नहीं चाहते। सभी डोमेन की सूची प्राप्त करने के लिए, इस लिंक का अनुसरण करें।
&& t.Namespace == @namespace
" हटाने की कोशिश की - "कौन सा टोकना मुझे सब कुछ देता है। नेट असेंबलियाँ :-)
&& t.Namespace == @namespace
तुम सब मिल कक्षाओं की सभी विधानसभाओं .net का भी शामिल है। GetAssemblies
आप सभी विधानसभाओं GetAssemblies().SelectMany(t => t.GetTypes())
को दे देंगे , और सभी विधानसभाओं से सभी प्रकार (कक्षाएं, संरचना आदि) दे देंगे।
Assembly.Load(nameof(NameOfMyNamespace))
ठीक काम करके असेंबली को लोड करने के लिए मजबूर करता हूं ।
using System.Reflection;
using System.Collections.Generic;
//...
static List<string> GetClasses(string nameSpace)
{
Assembly asm = Assembly.GetExecutingAssembly();
List<string> namespacelist = new List<string>();
List<string> classlist = new List<string>();
foreach (Type type in asm.GetTypes())
{
if (type.Namespace == nameSpace)
namespacelist.Add(type.Name);
}
foreach (string classname in namespacelist)
classlist.Add(classname);
return classlist;
}
NB: उपरोक्त कोड दिखाता है कि क्या हो रहा है। क्या आप इसे लागू करते हैं, एक सरलीकृत संस्करण का उपयोग किया जा सकता है:
using System.Linq;
using System.Reflection;
using System.Collections.Generic;
//...
static IEnumerable<string> GetClasses(string nameSpace)
{
Assembly asm = Assembly.GetExecutingAssembly();
return asm.GetTypes()
.Where(type => type.Namespace == nameSpace)
.Select(type => type.Name);
}
classlist
पर पहले पुनरावृत्ति पर सीधे जोड़ नहीं दिया asm.GetTypes()
।
एक विशिष्ट विधानसभा के लिए, नामस्पेस और क्लासनेम:
var assemblyName = "Some.Assembly.Name"
var nameSpace = "Some.Namespace.Name";
var className = "ClassNameFilter";
var asm = Assembly.Load(assemblyName);
var classes = asm.GetTypes().Where(p =>
p.Namespace == nameSpace &&
p.Name.Contains(className)
).ToList();
नोट: परियोजना को विधानसभा का संदर्भ देना चाहिए
यहां लोडर-एक्सेप्टेंस त्रुटियों के लिए एक फिक्स है जो आपको मिल सकती है यदि एक प्रकार की असेम्बली किसी अन्य असेंबली में टाइप करती है:
// Setup event handler to resolve assemblies
AppDomain.CurrentDomain.ReflectionOnlyAssemblyResolve += new ResolveEventHandler(CurrentDomain_ReflectionOnlyAssemblyResolve);
Assembly a = System.Reflection.Assembly.ReflectionOnlyLoadFrom(filename);
a.GetTypes();
// process types here
// method later in the class:
static Assembly CurrentDomain_ReflectionOnlyAssemblyResolve(object sender, ResolveEventArgs args)
{
return System.Reflection.Assembly.ReflectionOnlyLoad(args.Name);
}
कि अन्य विधानसभाओं में परिभाषित लोडिंग प्रकारों के साथ मदद करनी चाहिए।
उम्मीद है की वो मदद करदे!
Assembly a
सामान सामान्य प्रसंस्करण का प्रतिनिधित्व करता है जो इस घटना को आग लगा सकता है। मैं त्रुटियों के a
साथ मदद करने के लिए कोई उपयोग नहीं देखता LoaderException
। क्या मैं सही हू?
आप एक नाम स्थान में सभी प्रकार प्राप्त करने में सक्षम नहीं होंगे, क्योंकि एक नाम स्थान कई विधानसभाओं को पाट सकता है, लेकिन आप एक असेंबली में सभी कक्षाएं प्राप्त कर सकते हैं और यह देखने के लिए जांच कर सकते हैं कि क्या वे उस नाम स्थान से संबंधित हैं।
Assembly.GetTypes()
स्थानीय असेंबली पर काम करता है, या आप पहले किसी असेंबली को लोड कर सकते हैं, फिर उस GetTypes()
पर कॉल कर सकते हैं।
AppDomain.CurrentDomain.GetAssemblies
मददगार हो सकता है।
@Aku उत्तर की तरह, लेकिन विस्तार विधियों का उपयोग करते हुए:
string @namespace = "...";
var types = Assembly.GetExecutingAssembly().GetTypes()
.Where(t => t.IsClass && t.Namespace == @namespace)
.ToList();
types.ForEach(t => Console.WriteLine(t.Name));
केवल एक पंक्ति में नाम स्थान के नाम से सभी कक्षाएं प्राप्त करें:
var allClasses = Assembly.GetExecutingAssembly().GetTypes().Where(a => a.IsClass && a.Namespace != null && a.Namespace.Contains(@"..your namespace...")).ToList();
नामस्थान वास्तव में रनटाइम के डिजाइन में निष्क्रिय हैं और मुख्य रूप से संगठनात्मक उपकरण के रूप में काम करते हैं। .NET में एक प्रकार का पूरा नाम Namespace और Class / Enum / Etc के होते हैं। संयुक्त। यदि आप केवल एक विशिष्ट असेंबली के माध्यम से जाना चाहते हैं, तो आप असेंबली द्वारा लौटे प्रकारों के माध्यम से लूप करेंगे। GetExportedTypes () प्रकार का मान जाँच रहा है। नाम स्थान । यदि आप वर्तमान AppDomain में लोड सभी असेंबली के माध्यम से जाने की कोशिश कर रहे थे तो इसमें AppDomain.CurrentDomain का उपयोग करना शामिल होगा। GetAssemblies ()
//a simple combined code snippet
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
namespace MustHaveAttributes
{
class Program
{
static void Main ( string[] args )
{
Console.WriteLine ( " START " );
// what is in the assembly
Assembly a = Assembly.Load ( "MustHaveAttributes" );
Type[] types = a.GetTypes ();
foreach (Type t in types)
{
Console.WriteLine ( "Type is {0}", t );
}
Console.WriteLine (
"{0} types found", types.Length );
#region Linq
//#region Action
//string @namespace = "MustHaveAttributes";
//var q = from t in Assembly.GetExecutingAssembly ().GetTypes ()
// where t.IsClass && t.Namespace == @namespace
// select t;
//q.ToList ().ForEach ( t => Console.WriteLine ( t.Name ) );
//#endregion Action
#endregion
Console.ReadLine ();
Console.WriteLine ( " HIT A KEY TO EXIT " );
Console.WriteLine ( " END " );
}
} //eof Program
class ClassOne
{
} //eof class
class ClassTwo
{
} //eof class
[System.AttributeUsage ( System.AttributeTargets.Class |
System.AttributeTargets.Struct, AllowMultiple = true )]
public class AttributeClass : System.Attribute
{
public string MustHaveDescription { get; set; }
public string MusHaveVersion { get; set; }
public AttributeClass ( string mustHaveDescription, string mustHaveVersion )
{
MustHaveDescription = mustHaveDescription;
MusHaveVersion = mustHaveVersion;
}
} //eof class
} //eof namespace
AttributeClass
नाम क्या हैं MustHaveAttributes
? मुझे परीक्षण से संबंधित कुछ भी नहीं दिखाई देता है कि किसी वर्ग में विशेषताएँ हैं या नहीं। यह सहायक की तुलना में अधिक भ्रामक है।
काफी सरल
Type[] types = Assembly.Load(new AssemblyName("mynamespace.folder")).GetTypes();
foreach (var item in types)
{
}