Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
.NET Framework 4.6.1 har en verktygslåda med en uppsättning kontrollflödesaktiviteter, inklusive ForEach<T>, som gör det möjligt att iterera genom IEnumerable<T> samlingar.
ForEach<T> kräver att dess Values egenskap är av typen IEnumerable<T>. Detta hindrar användare från att iterera över datastrukturer som implementerar IEnumerable<T> gränssnitt (till exempel ArrayList). Den icke-generiska versionen av ForEach<T> övervinner det här kravet på bekostnad av mer körningskomplexitet för att säkerställa kompatibiliteten för typerna av värdena i samlingen.
Exemplet NonGenericForEach visar hur du implementerar en icke-generisk ForEach<T> aktivitet och dess designer. Den här aktiviteten kan användas för att iterera via ArrayList.
ForEach-aktivitet
C#/Visual Basic-instruktionen foreach räknar upp elementen i en samling och kör en inbäddad instruktion för varje element i samlingen. WF-motsvarande aktiviteter för foreach är ForEach<T> och ParallelForEach<T>. Aktiviteten ForEach<T> innehåller en lista med värden och en brödtext. Under körning itereras listan och kroppen körs för varje värde i listan.
I de flesta fall bör den allmänna versionen av aktiviteten vara den bästa lösningen, eftersom den omfattar de flesta scenarier där den skulle användas och tillhandahåller typkontroll vid kompileringstillfället. Den icke-generiska versionen kan användas för iterering via typer som implementerar det icke-generiska IEnumerable gränssnittet.
Klassdefinition
I följande kodexempel visas definitionen av en icke-generisk ForEach aktivitet.
[ContentProperty("Body")]
public class ForEach : NativeActivity
{
[RequiredArgument]
[DefaultValue(null)]
InArgument<IEnumerable> Values { get; set; }
[DefaultValue(null)]
[DependsOn("Values")]
ActivityAction<object> Body { get; set; }
}
Kropp (valfritt) ActivityAction av typen Object, som körs för varje element i samlingen. Varje enskilt element skickas till brödtexten via sin Argument egenskap.
Värden (valfritt) Samlingen med element som itereras över. Vid körning säkerställs att alla element i samlingen är av kompatibla typer.
Exempel på användning av ForEach
Följande kod visar hur du använder ForEach-aktiviteten i ett program.
string[] names = { "bill", "steve", "ray" };
DelegateInArgument<object> iterationVariable = new DelegateInArgument<object>() { Name = "iterationVariable" };
Activity sampleUsage =
new ForEach
{
Values = new InArgument<IEnumerable>(c=> names),
Body = new ActivityAction<object>
{
Argument = iterationVariable,
Handler = new WriteLine
{
Text = new InArgument<string>(env => string.Format("Hello {0}", iterationVariable.Get(env)))
}
}
};
| Tillstånd | Meddelande | Svårighetsgrad | Undantagstyp |
|---|---|---|---|
Värden är null |
Värdet för det obligatoriska aktivitetsargumentet "Values" angavs inte. | Fel | InvalidOperationException |
ForEach Designer
Aktivitetsdesignern för exemplet liknar den designer som tillhandahålls för den inbyggda ForEach<T> aktiviteten. Designern visas i verktygslådan i kategorin Exempel, icke-generiska aktiviteter . Designern heter ForEachWithBodyFactory i verktygslådan eftersom aktiviteten exponerar en IActivityTemplateFactory i verktygslådan, vilket skapar aktiviteten med en korrekt konfigurerad ActivityAction.
public sealed class ForEachWithBodyFactory : IActivityTemplateFactory
{
public Activity Create(DependencyObject target)
{
return new Microsoft.Samples.Activities.Statements.ForEach()
{
Body = new ActivityAction<object>()
{
Argument = new DelegateInArgument<object>()
{
Name = "item"
}
}
};
}
}
Så här kör du det här exemplet
Ange det projekt du väljer som startprojekt för lösningen:
CodeTestClient visar hur du använder aktiviteten med hjälp av kod.
DesignerTestClient visar hur du använder aktiviteten i designern.
Skapa och kör projektet.