Die Konfigurationsdatei+Reflexion macht die mühsame Auswahl von Anweisungen wirklich überflüssig und sorgt für einen schönen Ansturm!
Zuerst wurde die Klasse verbessert (oben verbunden):
Definieren Sie dann in der Konfigurationsdatei, welche Klassen wir verwenden möchten, die Einzelheiten, die wir verwenden möchten und benutzerdefinierte Tag-Handler:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 | namespace ClassLib
{
public interface IGreetingStrategy
{
string GreetingType { get; }
void SetGreetingWords(ITextControl textContrl);
}
public class EnglishGreeting : IGreetingStrategy
{
public string GreetingType
{
get { return "English" ; }
}
public void SetGreetingWords(ITextControl textContrl)
{
textContrl.Text = "hello,readers" ;
}
}
public class ChineseGreeting : IGreetingStrategy
{
private string greetingType;
public ChineseGreeting(string greetingType)
{
this.greetingType = greetingType;
}
public ChineseGreeting() : this( "中文" ) { }
public ChineseGreeting(XmlNode section) {
XmlAttribute attr = section.SelectSingleNode( "params" ).Attributes[ "greetingType" ];
greetingType = attr.Value;
}
public string GreetingType
{
get { return greetingType; }
}
public void SetGreetingWords(ITextControl textContrl)
{
textContrl.Text = "你好啊,小读者!" ;
}
}
public class GeneralClass
{
private IGreetingStrategy gs;
public GeneralClass(IGreetingStrategy gs)
{
this.gs = gs;
}
public string GeneralProperty
{
get
{
return "<span sytle='color:red'>" + gs.GreetingType + "</span>" ;
}
}
public void GeneralMethod(ITextControl textContrl)
{
gs.SetGreetingWords(textContrl);
textContrl.Text = "<span sytle='color:red'>" + textContrl.Text + "</span>" ;
}
}
}
|
Nach dem Login kopieren
Hier ist ChineseGreeting die Klasse, die wir verwenden möchten, und die oben definierte Klasse ist die Klasse, die GreetingStrategy verarbeitet; 🎜>
1 2 3 4 5 6 7 | <!--greetingStrategy节点及其处理程序配置-->
<configSections>
<section name= "greetingStrategy" type= "ClassLib.GreetingConfigurationHandler,ClassLib" />
</configSections>
<greetingStrategy type= "ClassLib.ChineseGreeting,ClassLib" >
<params greetingType= "***中文问候***" /> <!--构造函数的参数-->
</greetingStrategy>
|
Nach dem Login kopieren
Schreiben Sie als Nächstes die spezifische Implementierung dieser Klasse:
In der Erstellungsmethode Wir stellen zunächst fest, ob die ChineseGreeting-Klasse eine Konstruktionsmethode mit einem Parameter als Knoten hat. Wenn ja, verwenden Sie den Abschnitt direkt als Parameter und übergeben Sie ihn, wenn Sie eine Typinstanz verwenden
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 | namespace ClassLib
{
public class GreetingConfigurationHandler : IConfigurationSectionHandler
{
public object Create(object parent, object configContext, System.Xml.XmlNode section)
{
Type t = Type. GetType (section.Attributes[ "type" ].Value);
object obj=null;
try
{
Type[] paras = { typeof(XmlNode) };
ConstructorInfo constructors = t.GetConstructor(paras);
if (constructors != null)
{
object[] paramters = { section };
return Activator.CreateInstance(t, paramters);
}
if (section.SelectSingleNode( "params" ) == null)
{
obj = Activator.CreateInstance(t);
}
else
{
XmlAttribute attr = section.SelectSingleNode( "params" ).Attributes[ "greetingType" ];
object[] parameters = { attr.Value };
obj = Activator.CreateInstance(t, parameters);
}
}
catch (Exception)
{
return null;
}
return obj ;
}
}
}
|
Nach dem Login kopieren
Wenn es keine solche Konstruktionsmethode gibt, lesen wir die Parameter in der XML-Datei in dieser Verarbeitungsklasse und übergeben sie dann, wenn der Typ instanziiert wird.
Vergleich der beiden Tatsächlich ist es egal, es kommt nur darauf an, wie schnell dieser Parameter gelesen wird. Nach einem persönlichen Vergleich habe ich das Gefühl, dass die Art und Weise, wie die Konstruktorparameter in der Konfigurationsdatei in dieser Klasse gelesen werden, flexibler ist, was meine persönliche Meinung ist Präferenz.
Schreiben Sie etwas zum Testen:
Hehe, es ist relativ praktisch.
Die Die Kosten sind gering, daher sollte die Konfigurationsdatei zu diesem Zeitpunkt hochgeladen werden. . . . . .
1 2 3 4 5 6 7 8 9 | #region 自定义节点存储类型信息——反射方法
IGreetingStrategy greetingStrategy = (IGreetingStrategy)ConfigurationManager.GetSection( "greetingStrategy" );
if (greetingStrategy != null)
{
GeneralClass generalClass = new GeneralClass(greetingStrategy);
ltrGreetingType.Text = generalClass.GeneralProperty;
generalClass.GeneralMethod(ltrGreetingWord);
}
#endregion
|
Nach dem Login kopieren
Das Obige ist der Inhalt der .Net-Konfigurationsdatei – Instanz des Speichertyps „Reflexion + Konfigurationsdatei“. Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website (www.php.cn).
