मुझे लगता है कि यह आसान रखने के लिए, शायद कुछ इस तरह सबसे अच्छा है:
public static class LoggerFactory
{
static readonly Dictionary<Type, Type> loggers = new Dictionary<Type, Type>();
public static void AddLoggerProvider<T, TLogger>() where TLogger : ILogger<T>, new()
{
loggers.Add(typeof(T), typeof(TLogger));
}
public static ILogger<T> CreateLogger<T>()
{
//implement some error checking here
Type tLogger = loggers[typeof(T)];
ILogger<T> logger = (ILogger<T>) Activator.CreateInstance(tLogger);
return logger;
}
}
तुम बस प्रत्येक प्रकार आप का समर्थन करने के क्रम में बढ़ाया जा सकता है चाहते हैं के लिए AddLoggerProvider
कहते हैं, यह आप निश्चित रूप से एक जोड़ने सुनिश्चित करता है लाइब्रेरी में इंटरफ़ेस का कार्यान्वयन और कुछ ऑब्जेक्ट नहीं, Activator
की वजह से बहुत तेज़ नहीं है, लेकिन लॉगर बनाने की संभावना किसी भी तरह की बाधा नहीं होगी। उम्मीद है कि यह ठीक दिखता है।
उपयोग:
// initialize somewhere
LoggerFactory.AddLoggerProvider<String, StringLogger>();
LoggerFactory.AddLoggerProvider<Exception, ExceptionLogger>();
// etc..
ILogger<string> stringLogger = LoggerFactory.CreateLogger<string>();
नोट: प्रत्येक ILogger<T>
Activator
के लिए एक parameterless निर्माता आवश्यकता है, लेकिन वह भी ऐड विधि में new()
सामान्य बाधा के साथ सुनिश्चित किया जाता है।
स्रोत
2009-07-17 20:55:30
के लिए +1 वास्तव में, आप सक्रियकर्ता का उपयोग कर पाएंगे बहुत धीमा है: http://www.csharp-architect.com/post/2009/06/11/Generic- new-T%28%29- प्रदर्शन-अंक और एक समाधान।एएसपीएक्स –
मैंने लिखा "एक्टिवेटर की वजह से बहुत तेज़ नहीं है" ताकि यह "बहुत धीमा" के साथ अनन्य न हो :) –