Megosztás a következőn keresztül:


Útmutató: Dinamikus objektumok létrehozása és használata c nyelven#

A dinamikus objektumok a fordítási idő helyett futtatáskor teszik elérhetővé a tagokat, például tulajdonságokat és metódusokat. A dinamikus objektumok lehetővé teszik, hogy olyan objektumokat hozzon létre, amelyekkel nem egyeznek statikus típusú vagy formátumú struktúrákkal való munkavégzés során. Használhat például egy dinamikus objektumot a HTML-dokumentumobjektum-modellre (DOM), amely érvényes HTML-jelölőelemek és attribútumok bármilyen kombinációját tartalmazhatja. Mivel minden HTML-dokumentum egyedi, egy adott HTML-dokumentum tagjai futásidőben lesznek meghatározva. Egy HTML-elem attribútumára való hivatkozás gyakori módszere az attribútum nevének átadása az GetProperty elem metódusának. A HTML-elem id attribútumára való hivatkozáshoz először be kell szereznie a <div id="Div1"> elemre mutató hivatkozást, majd használnia kell a <div>-t. Ha dinamikus objektumot használ, hivatkozhat az id attribútumra divElement.id.

A dinamikus objektumok emellett kényelmes hozzáférést biztosítanak olyan dinamikus nyelvekhez, mint az IronPython és az IronRuby. Dinamikus objektummal futtatáskor értelmezett dinamikus szkriptekre hivatkozhat.

Egy dinamikus objektumra késői kötéssel hivatkozhat. A késői kötésű objektumok dynamictípusát a következőképpen adhatja meg: . További információ: dinamikus.

Egyéni dinamikus objektumokat a névtérben lévő System.Dynamic osztályok használatával hozhat létre. Létrehozhat például egy ExpandoObject objektumot, és megadhatja az objektum tagjait futásidőben. Létrehozhat saját típust is, amely örökli az osztályt DynamicObject . Ezután felülírhatja az DynamicObject osztály tagjait a futásidejű dinamikus funkciók biztosításához.

Ez a cikk két független útmutatót tartalmaz:

  • Hozzon létre egy egyéni objektumot, amely dinamikusan elérhetővé teszi egy szövegfájl tartalmát egy objektum tulajdonságaiként.
  • Hozzon létre egy tárat IronPython használó projektet.

Előfeltételek

Megjegyzés:

Előfordulhat, hogy a számítógép különböző neveket vagy helyeket jelenít meg a Visual Studio felhasználói felületének egyes elemeihez az alábbi utasításokban. Ezeket az elemeket a Visual Studio-kiadás és a használt beállítások határozzák meg. További információért lásd: A fejlesztői környezet személyre szabása.

Egyéni dinamikus objektum létrehozása

Az első útmutató egy egyéni dinamikus objektumot határoz meg, amely egy szövegfájl tartalmában keres. A dinamikus tulajdonság megadja a keresendő szöveget. Például, ha a hívási kód megadja a dynamicFile.Sample-t, a dinamikus osztály egy olyan általános szöveges lista formátumú listát ad vissza, amely tartalmazza az összes sort a fájlból, amelyek "Minta" szöveggel kezdődnek. A keresés nem érzékeny a kis- és nagybetűkre. A dinamikus osztály két választható argumentumot is támogat. Az első argumentum egy keresési beállítás enumerálási értéke, amely azt határozza meg, hogy a dinamikus osztálynak a sor elején, a sor végén vagy bárhol a sorban kell keresnie az egyezéseket. A második argumentum azt határozza meg, hogy a dinamikus osztály a keresés előtt minden sorból levágja a kezdő és záró szóközöket. Ha például a hívási kód megadása történik dynamicFile.Sample(StringSearchOption.Contains), a dinamikus osztály a "Minta" kifejezésre keres bárhol a sorban. Ha a hívási kód megadja dynamicFile.Sample(StringSearchOption.StartsWith, false), a dinamikus osztály "Sample" kifejezésre keres az egyes sorok elején, és nem távolítja el a kezdő és záró szóközöket. A dinamikus osztály alapértelmezett viselkedése az, hogy az egyes sorok elején keres egyezést, és eltávolítja a kezdő és záró szóközöket.

Egyéni dinamikus osztály létrehozása

Indítsa el a Visual Studiót. Válassza az Új projekt létrehozása lehetőséget. Az Új projekt létrehozása párbeszédpanelen válassza a C#, a Konzolalkalmazás, majd a Tovább lehetőséget. Az új projekt konfigurálása párbeszédpanelen adja meg DynamicSample a projekt nevét, majd válassza a Tovább gombot. A További információ párbeszédpanelen válassza a .NET 7.0 (Aktuális) lehetőséget a cél-keretrendszerhez, majd válassza a Létrehozás lehetőséget. A Megoldáskezelőben kattintson a jobb gombbal a DynamicSample projektre, és válassza azOsztály>. Írja be a ReadOnlyFile mezőbe, majd válassza a Hozzáadás lehetőséget. A ReadOnlyFile.cs vagy ReadOnlyFile.vb fájl tetején adja hozzá a következő kódot a System.IO és System.Dynamic névterek importálásához.

using System.IO;
using System.Dynamic;

Az egyéni dinamikus objektum enumerálást használ a keresési feltételek meghatározásához. Az osztály definíció előtt adja hozzá a következő enum definíciót.

public enum StringSearchOption
{
    StartsWith,
    Contains,
    EndsWith
}

Frissítse az osztályutasítást, hogy örökölje az DynamicObject osztályt, ahogy az az alábbi kód példában is látható.

class ReadOnlyFile : DynamicObject

Adja hozzá az alábbi kódot az osztályhoz a ReadOnlyFile fájl elérési útjának privát mezőjének és az osztály konstruktorának ReadOnlyFile meghatározásához.

// Store the path to the file and the initial line count value.
private string p_filePath;

// Public constructor. Verify that file exists and store the path in
// the private variable.
public ReadOnlyFile(string filePath)
{
    if (!File.Exists(filePath))
    {
        throw new Exception("File path does not exist.");
    }

    p_filePath = filePath;
}
  1. Adja hozzá a következő GetPropertyValue metódust az ReadOnlyFile osztályhoz. A GetPropertyValue metódus bemenetként keresési feltételeket vesz fel, és visszaadja az adott keresési feltételnek megfelelő szövegfájl sorait. A ReadOnlyFile osztály által biztosított dinamikus metódusok a GetPropertyValue metódust hívják meg, hogy lekérjék a megfelelő eredményeket.
public List<string> GetPropertyValue(string propertyName,
                                     StringSearchOption StringSearchOption = StringSearchOption.StartsWith,
                                     bool trimSpaces = true)
{
    StreamReader sr = null;
    List<string> results = new List<string>();
    string line = "";
    string testLine = "";

    try
    {
        sr = new StreamReader(p_filePath);

        while (!sr.EndOfStream)
        {
            line = sr.ReadLine();

            // Perform a case-insensitive search by using the specified search options.
            testLine = line.ToUpper();
            if (trimSpaces) { testLine = testLine.Trim(); }

            switch (StringSearchOption)
            {
                case StringSearchOption.StartsWith:
                    if (testLine.StartsWith(propertyName.ToUpper())) { results.Add(line); }
                    break;
                case StringSearchOption.Contains:
                    if (testLine.Contains(propertyName.ToUpper())) { results.Add(line); }
                    break;
                case StringSearchOption.EndsWith:
                    if (testLine.EndsWith(propertyName.ToUpper())) { results.Add(line); }
                    break;
            }
        }
    }
    catch
    {
        // Trap any exception that occurs in reading the file and return null.
        results = null;
    }
    finally
    {
        if (sr != null) {sr.Close();}
    }

    return results;
}

GetPropertyValue metódus után adja hozzá a következő kódot a(z) TryGetMember osztály DynamicObject metódusának felülbírálásához. A TryGetMember metódus akkor lesz meghívva, ha egy dinamikus osztály egy tagját kérik le, és nincsenek megadva argumentumok. Az binder argumentum információt tartalmaz a hivatkozott tagról, az argumentum pedig result a megadott tagnak visszaadott eredményre hivatkozik. A TryGetMember metódus egy logikai értéket ad vissza, amely akkor ad vissza true , ha a kért tag létezik, ellenkező esetben ad vissza false.

// Implement the TryGetMember method of the DynamicObject class for dynamic member calls.
public override bool TryGetMember(GetMemberBinder binder,
                                  out object result)
{
    result = GetPropertyValue(binder.Name);
    return result == null ? false : true;
}

TryGetMember metódus után adja hozzá a következő kódot a(z) TryInvokeMember osztály DynamicObject metódusának felülbírálásához. A TryInvokeMember metódus akkor lesz meghívva, ha egy dinamikus osztály egy tagját argumentumokkal kérik le. Az binder argumentum információt tartalmaz a hivatkozott tagról, az argumentum pedig result a megadott tagnak visszaadott eredményre hivatkozik. Az args argumentum a tagnak átadott argumentumok tömbét tartalmazza. A TryInvokeMember metódus egy logikai értéket ad vissza, amely akkor ad vissza true , ha a kért tag létezik, ellenkező esetben ad vissza false.

A metódus egyéni verziója TryInvokeMember arra számít, hogy az első argumentum értéke az StringSearchOption előző lépésben definiált számból származik. A TryInvokeMember metódus azt várja, hogy a második argumentum logikai érték legyen. Ha az egyik vagy mindkét argumentum érvényes érték, a rendszer átadja őket a GetPropertyValue metódusnak az eredmények lekéréséhez.

// Implement the TryInvokeMember method of the DynamicObject class for
// dynamic member calls that have arguments.
public override bool TryInvokeMember(InvokeMemberBinder binder,
                                     object[] args,
                                     out object result)
{
    StringSearchOption StringSearchOption = StringSearchOption.StartsWith;
    bool trimSpaces = true;

    try
    {
        if (args.Length > 0) { StringSearchOption = (StringSearchOption)args[0]; }
    }
    catch
    {
        throw new ArgumentException("StringSearchOption argument must be a StringSearchOption enum value.");
    }

    try
    {
        if (args.Length > 1) { trimSpaces = (bool)args[1]; }
    }
    catch
    {
        throw new ArgumentException("trimSpaces argument must be a Boolean value.");
    }

    result = GetPropertyValue(binder.Name, StringSearchOption, trimSpaces);

    return result == null ? false : true;
}

Mentse és zárja be a fájlt.

Minta szövegfájl létrehozása

A Megoldáskezelőben kattintson a jobb gombbal a DynamicSample projektre, és válassza azÚj elem> lehetőséget. A Telepített sablonok panelen válassza az Általános, majd a Szövegfájl sablont. Hagyja meg a TextFile1.txt alapértelmezett nevét a Név mezőben, majd válassza a Hozzáadás lehetőséget. Másolja a következő szöveget a TextFile1.txt fájlba.

List of customers and suppliers

Supplier: Lucerne Publishing (https://www.lucernepublishing.com/)
Customer: Preston, Chris
Customer: Hines, Patrick
Customer: Cameron, Maria
Supplier: Graphic Design Institute (https://www.graphicdesigninstitute.com/)
Supplier: Fabrikam, Inc. (https://www.fabrikam.com/)
Customer: Seubert, Roxanne
Supplier: Proseware, Inc. (http://www.proseware.com/)
Customer: Adolphi, Stephan
Customer: Koch, Paul

Mentse és zárja be a fájlt.

Egyéni dinamikus objektumot használó mintaalkalmazás létrehozása

A Megoldáskezelőben kattintson duplán a Program.cs fájlra. Adja hozzá az alábbi kódot az eljáráshoz az Main osztály egy példányának ReadOnlyFile létrehozásához a TextFile1.txt fájlhoz. A kód késői kötést használ a dinamikus tagok meghívásához és az "Ügyfél" sztringet tartalmazó szövegsorok lekéréséhez.

dynamic rFile = new ReadOnlyFile(@"..\..\..\TextFile1.txt");
foreach (string line in rFile.Customer)
{
    Console.WriteLine(line);
}
Console.WriteLine("----------------------------");
foreach (string line in rFile.Customer(StringSearchOption.Contains, true))
{
    Console.WriteLine(line);
}

Mentse a fájlt, és nyomja le a Ctrl F5 billentyűkombinációt+az alkalmazás létrehozásához és futtatásához.

Dinamikus nyelvi kódtár meghívása

Az alábbi útmutató egy olyan projektet hoz létre, amely az IronPython dinamikus nyelven írt kódtárhoz fér hozzá.

Egyéni dinamikus osztály létrehozása

A Visual Studióban válassza a Fájl>Új>Projekt lehetőséget. Az Új projekt létrehozása párbeszédpanelen válassza a C#, a Konzolalkalmazás, majd a Tovább lehetőséget. Az új projekt konfigurálása párbeszédpanelen adja meg DynamicIronPythonSample a projekt nevét, majd válassza a Tovább gombot. A További információ párbeszédpanelen válassza a .NET 7.0 (Aktuális) lehetőséget a cél-keretrendszerhez, majd válassza a Létrehozás lehetőséget. Telepítse az IronPython NuGet-csomagot. Szerkessze a Program.cs fájlt. A fájl tetején adja hozzá a következő kódot, hogy importálja az Microsoft.Scripting.Hosting és IronPython.Hosting névtereket az IronPython könyvtárakból, valamint a System.Linq névteret.

using System.Linq;
using Microsoft.Scripting.Hosting;
using IronPython.Hosting;

A Main metódusban adja hozzá a következő kódot egy új Microsoft.Scripting.Hosting.ScriptRuntime objektum létrehozásához az IronPython-kódtárak üzemeltetéséhez. Az ScriptRuntime objektum betölti az IronPython könyvtármodult random.py.

// Set the current directory to the IronPython libraries.
System.IO.Directory.SetCurrentDirectory(
   Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles) +
   @"\IronPython 2.7\Lib");

// Create an instance of the random.py IronPython library.
Console.WriteLine("Loading random.py");
ScriptRuntime py = Python.CreateRuntime();
dynamic random = py.UseFile("random.py");
Console.WriteLine("random.py loaded.");

Miután betöltötte a random.py modult, adja hozzá a következő kódot, hogy egész számokat tartalmazó tömböt hozzon létre. A tömb a random.py modul metódusának lesz átadva shuffle , amely véletlenszerűen rendezi a tömb értékeit.

// Initialize an enumerable set of integers.
int[] items = Enumerable.Range(1, 7).ToArray();

// Randomly shuffle the array of integers by using IronPython.
for (int i = 0; i < 5; i++)
{
    random.shuffle(items);
    foreach (int item in items)
    {
        Console.WriteLine(item);
    }
    Console.WriteLine("-------------------");
}

Mentse a fájlt, és nyomja le a Ctrl F5 billentyűkombinációt+az alkalmazás létrehozásához és futtatásához.

Lásd még