डैन फील्ड में powershell script है जो xsd.exe आउटपुट क्लास लेता है और इसके सरणी जेनेरिक सूचियों में बदल जाता है। इसने मेरे लिए एक साधारण वर्ग के साथ अच्छा काम किया है, लेकिन मुझे नहीं पता कि यह कितना अच्छा है। मैंने नीचे लिपि चिपकाई है। कमांड प्रॉम्प्ट से कॉल करें
"$(TargetFrameworkSDKToolsDirectory)xsd.exe" /c "$(ProjectDir)ImportedPartCanonical.xsd" "$(ProjectDir)ProjectCanonical.xsd" /n:Tallan.BT.PipelineComponents
powershell.exe -ExecutionPolicy Unrestricted -file "$(solutiondir)\PowerShellScripts\PostProcessXsdExe.ps1" ProjectCanonical.cs "$(SolutionDir)Tallan.BT.PipelineComponents\SerializedClasses\ProjectCanonical.cs"
पूर्ण स्पष्टीकरण के लिए लिंक देखें।
# Author: Dan Field ([email protected])
# posted on blog.tallan.com/2016/03/10/xsd-exe-arrays-and-specified
# Purpose: fix the 'specified' attribute and convert arrays to list from XSD.exe generated classes
[CmdletBinding()]
Param(
[Parameter(Mandatory=$true,Position=1)]
[string]$inputFile,
[Parameter(Mandatory=$true,Position=2)]
[string]$outputFile,
[switch]$DeleteInputFile
)
# much faster than using Get-Content and/or Out-File/Set-Content
$writer = [System.IO.StreamWriter] $outputFile
$reader = [System.IO.StreamReader] $inputFile
# used to track Specified properties
$setterDict = @{}
while (($line = $reader.ReadLine()) -ne $null)
{
$thisStart = $line.IndexOf("this.") # will be used for
$brackets = $line.IndexOf("[]") # indicates an array that will be converted to a Generic List
# assume that any private field that contains "Specified" needs to be grabbed
if (($line.IndexOf("private") -gt -1) -and ($line.IndexOf("Specified") -gt -1))
{
# get the field name
$varName = $line.Split("{' ',';'}", [System.StringSplitOptions]::RemoveEmptyEntries)[-1]
# use field name as a key, minus the ending "Specified" portion, e.g. fieldNameSpecified -> fieldName
# the value in the dictionary will be added to setters on the main property, e.g. "this.fieldNameSpecified = true;"
$setterDict.Add($varName.Substring(0, $varName.IndexOf("Specified")), "this." + $varName + " = true;")
# output the line as is
$writer.WriteLine($line)
}
# find property setters that aren't for the *Specified properties
elseif (($thisStart -gt -1) -and ($line.IndexOf(" = value") -gt -1) -and ($line.IndexOf("Specified") -lt 0))
{
# get the field name
$thisStart += 5
$varName = $line.Substring($thisStart, $line.IndexOf(' ', $thisStart) - $thisStart)
# see if there's a "Specified" property for this one
if ($setterDict.ContainsKey($varName) -eq $true)
{
# set the Specified property whenever this property is set
$writer.WriteLine((' ' * ($thisStart - 5)) + $setterDict[$varName])
}
# output the line itself
$writer.WriteLine($line)
}
elseif ($brackets -gt 0) # change to List<T>
{
$lineParts = $line.Split(' ')
foreach ($linePart in $lineParts)
{
if ($linePart.Contains("[]") -eq $true)
{
$writer.Write("System.Collections.Generic.List<" + $linePart.Replace("[]", "> "))
}
else
{
$writer.Write($linePart + " ")
}
}
$writer.WriteLine();
}
else # just output the original line
{
$writer.WriteLine($line)
}
}
if ($DeleteInputFile -eq $true)
{
Remove-Item $inputFile
}
# Make sure the file gets fully written and clean up handles
$writer.Flush();
$writer.Dispose();
$reader.Dispose();
स्रोत
2017-09-03 16:39:07
क्या आप उस पंक्ति को प्रतिस्थापित कर रहे हैं जिसमें एक सूची के साथ एक ऐरे [] है? या कोड के किसी अन्य लाइन भी संपादित हैं? –
Gero
बस लाइनें जहां निश्चित सरणी शामिल हैं। उपकरण सी # -सोर्स को पार्स कर रहा है और इसे एनआरफैक्ट्री की मदद से एएसटी (सार सिंटेक्स ट्री) में स्थानांतरित कर रहा है। तो परिवर्तन एक मजबूत तरीके से लागू होते हैं। विचार मूल के जितना संभव हो उतना स्पर्श करना था। – EvilBad
हाँ, नवीनतम संस्करण अपलोड करें। – Gero