Domanda

sto programmazione in C # .NET. E 'possibile interrompere la procedura di set di una proprietà di classe, senza un'eccezione?

Ecco quello che voglio fare ...

public int RandomProperty
{
    set
    {
     DialogResult answer = new DialogResult();
     answer = MessageBox.Show("This process could take up to 5 min. Are you sure you want to continue?");
     if(answer = DialogResult.No) 
        CancelSet   // Can I do something similar here?
     else
     {
      ...Do set procedure
     }
    }
}

Non credo che posso utilizzare un metodo (invece di una proprietà) perché sto impostazione di questo valore con un PropertyGrid.

È stato utile?

Soluzione

In nessun caso si deve fare nulla di tutto questo. Una proprietà deve essere sempre veloce e logicamente rappresentano una proprietà di qualcosa. Idealmente dovrebbe mai mancare. Certamente non dovrebbe produrre effetti collaterali come popping up UI. Si sta violando tutte queste importanti linee guida. Non farlo.

Inoltre, la vostra progettazione dell'interfaccia utente è male. Non chiedere a un utente in anticipo "questa operazione potrebbe richiedere un po ', sei sicuro?" e poi punirli con una lunga attesa se si fa clic su Sì. Al contrario, avviare l'operazione, e se non restituisce rapidamente, un elemento dell'interfaccia utente che mostra una barra di avanzamento e di un sinistro tempo stimato che ha un pulsante Annulla pop-up.

Probabilmente si dovrebbe scrivere il funzionamento di lungo corso come un metodo asincrono che può essere annullato in modo pulito su un altro thread.

Una buona architettura per questo genere di cose è quello di avere il tuo metodo di ritorno subito un oggetto che espone gli eventi come "Sto ancora in corso ed ecco a che punto sono", oppure "ho finito ora ed ecco il risultato ", oppure 'ho ottenuto un errore durante il tentativo di fare l'operazione e qui è quello che è'. Tale oggetto può anche esporre un metodo "cancellare" che sa comunicare con il filo lavoratore e spegnerlo pulita. Il chiamante del metodo che ottiene questo oggetto può quindi decidere come visualizzare l'interfaccia utente per l'utente.

Con questa architettura di separare la logica dell'interfaccia utente, la logica asincronia e la logica dei processi di business tra loro in modo pulito. Questo è un lavoro, ma paga i dividendi in seguito.

Altri suggerimenti

IMO che non è semplicemente una buona cosa da fare - aspettativa è che se il set non gettarlo assegnato il valore. Prova nell'interfaccia utente (o dove-mai) prima fare il set, o lanciare e gestire un'eccezione. In alternativa, il chiamante potrebbe essere meno confuso con un metodo:

public bool TrySetRandomProperty(SomeType value) {
    ...
}

che restituisce true o false per indicare se è successo. Si dovrebbe anche evitare il sanguinamento codice di interfaccia utente in logica di dominio; forse utilizzare un evento di lasciare che il discorso interfaccia utente per l'utente senza infliggere una particolare implementazione dell'interfaccia utente sul chiamante?

Ugh. Vuoi davvero di coinvolgere l'interfaccia utente all'interno di una proprietà di classe? Se non si esegue questa operazione il check più lontano nell'interfaccia utente?

Si può certamente codice in questo modo, solo che non imposta il campo.

Tuttavia, hai un pessimo design come si stia mescolando UI nel vostro codice di basso livello.

Porsi la domanda prima di impostare la proprietà è una sola opzione.

Basta tornare fuori dal set. Dovrete utilizzare un campo privato per contenere il valore di ciò che si desidera impostare, ma tornare in "cancel" dovrebbe farlo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top