Vra

Ek is besig met 'n metode wat 'n uitdrukking boom aanvaar as 'n parameter, saam met 'n tipe (of instansie) van 'n klas.

Die basiese idee is dat hierdie metode sekere dinge sal bydra tot 'n versameling wat gebruik sal word vir bekragtiging.

public interface ITestInterface
{
    //Specify stuff here.
}

private static void DoSomething<T>(Expression<Func<T, object>> expression, params IMyInterface[] rule)
{
    // Stuff is done here.
}

Die metode is soos volg genoem:

class TestClass
{
    public int MyProperty { get; set; }
}

class OtherTestClass  : ITestInterface
{
    // Blah Blah Blah.
}

static void Main(string[] args)
{
    DoSomething<TestClass>(t => t.MyProperty, 
        new OtherTestClass());
}

Ek doen dit op hierdie manier, want ek wil vir die eiendom name wat geslaag in te sterk getikte wees.

'n Paar dinge wat ek sukkel met ..

  1. Binne DoSomething, wil ek graag 'n PropertyInfo tipe kry (van die liggaam geslaag in) van T en voeg dit by 'n versameling saam met reël []. Op die oomblik is ek dink oor die gebruik van expression.Body en die verwydering van [propertyname] van "Skakel. ([Propertyname])" en die gebruik van besinning te kry wat ek nodig het. Dit blyk omslagtig en verkeerd. Is daar 'n beter manier?
  2. Is dit 'n spesifieke patroon Ek gebruik?
  3. Laastens, enige voorstelle of verduideliking as om my misverstand van wat ek doen word waardeer en / of hulpbronne of goeie inligting oor C # uitdrukking bome sowel waardeer.

Dankie!

Ian

Edit:

'n Voorbeeld van wat expression.Body.ToString() opbrengste binne die DoSomething metode is 'n string wat bevat "Skakel (t.MyProperty)" As genoem van die voorbeeld hierbo.

Ek doen dit nodig het ten sterkste moet getik wees, so dit sal nie saam te stel as ek 'n naam eiendom te verander.

Dankie vir die voorstelle!

Was dit nuttig?

Oplossing

Die insameling PropertyInfo voorwerpe uit Expression.Body lyk soortgelyk aan my oplossing na 'n ander vraag.

Ander wenke

Ek mate afhanklik van uitdrukking bome om 'n baie wat ek wil doen met my huidige aansoek op te stel-time stoot, dit wil sê statiese tipe nagaan.

Ek deurkruis uitdrukking bome om hulle vertaal in iets anders wat "sinvol".

Een ding wat ek beland besig met 'n baie is dat in plaas van URLs ek staatmaak op 'n MVC soos benadering waar Ek verklaar lambda funksies, en vertaal dit ... interpreteer, die samesteller gegenereer uitdrukking boom in 'n URL. Wanneer hierdie URL is opgeroep, ek doen die teenoorgestelde. Op hierdie manier, ek het wat ek noem stel-time tjeks vir gebroke skakels en dit werk baie goed saam met refactoring en oorlaai sowel. Ek dink dit is cool om te dink oor die gebruik van uitdrukking bome in hierdie manier.

Jy kan wil check die besoeker patroon, is dit 'n pyn om te begin met, want dit maak nie veel sin maak in die begin, maar dit bind alles saam en dit is 'n baie formele manier om tipe kontrole in samesteller konstruksie op te los. Jy kan dieselfde doen, maar in plaas van tipe kontrole uitstraal wat ooit wat jy nodig het.

Iets wat ek op die oomblik my kop dreun teen is die vermoë om 'n eenvoudige raamwerk te bou vir die vertaling van (of eintlik moet ek sê interpreteer) uitdrukking haarlok en uitstraal JavaScript. Die idee is dat die samesteller gegenereer uitdrukking bome sal vertaal in geldig JavaScript wat skakels met 'n paar voorwerp model.

Wat is opwindend oor hierdie is die manier waarop die samesteller is altyd in staat om vir my te sê wanneer ek verkeerd gaan en seker die eindresultaat is net 'n klomp van snare, maar die belangrike deel is hoe hierdie snare het geskep. Hulle het deur 'n paar verifikasie en dit beteken iets.

As jy dit gaan daar min jy nie kan doen met uitdrukking bome.

Terwyl jy werk met die System.Reflection.Emit dinge het ek myself met behulp van uitdrukking bome om 'n lig-gewig raamwerk vir dinamiese samestelling, wat tydens kompilering basies kon sê as my dinamiese geskep gemeentes sowel sou stel te skep, en dit het gewerk moeiteloos met nadenke en statiese tipe nagaan. Dit het dit verder en verder en het uiteindelik met iets wat op die ou end 'n baie tyd gespaar en was baie rats en sterk te wees.

Ek is mal oor hierdie soort dinge, en dit is wat meta ontwikkeling is alles oor, skryf programme in jou programme wat programme doen. Ek sê dit hou kom!

Ek waardeer wat jy probeer om te doen met die eiendom hier. Ek het loop in hierdie raaisel. Dit voel altyd vreemd om te skryf:

DoSomething("MyProperty", new OtherClass());

As die eiendom ooit verander naam, of die teks is verkeerd getik in die oproep, dan sal daar 'n probleem te wees nie. Wat ek het gekom om te leer, is dat dit is iets wat jy waarskynlik te doen het met via toets. Spesifiek, eenheid toets. Ek sou skryf eenheid toetse af te dwing dat die "DoSomething" oproepe korrek werk nie.

Die ander ding wat jy kan probeer is om jou eiendom te versier met eienskappe, en dan dink teen jou klas toe dit gebou is op soek na eiendomme met die kenmerk, en laai reëls.

[DoSomething(typeof(OtherClass), typeof(OtherClass2))]
public int MyProperty
{
  get;
  set;
}

In hierdie geval is die konstruktor (miskien in 'n basis klas?) Sou dinamiese skep 'n OtherClass voorwerp en 'n OtherClass2 voorwerp, en laai dit in 'n versameling saam met die naam van die eiendom.

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top