Basé sur http://alexreg.wordpress.com/2009/05/03/strongly-typed-csv-reader-in-c/, j'ai créé une DLL qui peut lire différents types de fichiers. J'ai aussi des tests unitaires qui fonctionnent avec succès. Je crée une structure et l'utilise comme type générique. Quoi qu'il en soit, quand je compile, j'obtiens un avertissement sur chacun des champs de la structure. Par exemple: le champ 'FileReader.Tests.CsvReader.Record.Field1' n'est jamais assigné à, et aura toujours sa valeur par défaut 0C# les champs struct sont des avertissements "never assigned to"
Je suis en train de définir la valeur avec SetValueDirect() et quand je passe les tests ou déboguer le code, je peux le vérifier. Pourquoi me donne-t-il alors cette erreur, et comment puis-je l'éviter ou la réparer?
Voici un code de base pour vous donner une idée. Je suppose que je n'ai pas fourni assez, mais j'espère que quelqu'un a une idée.
public abstract class FileReader<TRecord> : IDisposable where TRecord : struct
{
public TRecord? ReadRecord()
{
List<string> fields;
string rawData;
this.recordNumber++;
while (this.ReadRecord(this.fieldTypeInfoList.Length, out fields, out rawData))
{
try
{
// Insert the current record number to the beginning of the field list
fields.Insert(0, this.recordNumber.ToString(CultureInfo.InvariantCulture));
// Convert each field to its correct type and set the value
TRecord record = new TRecord();
FieldTypeInfo fieldTypeInfo;
object fieldValue;
// Loop through each field
for (int i = 0; i < this.fieldTypeInfoList.Length; i++)
{
fieldTypeInfo = this.fieldTypeInfoList[i];
bool allowNull = fieldTypeInfo.AllowNull == null ? this.AllowNull : fieldTypeInfo.AllowNull.Value;
if (i >= fields.Count && !allowNull)
{
// There are no field values for the current field
throw new ParseException("Field is missing", this.RecordNumber, fieldTypeInfo, rawData);
}
else
{
// Trim the field value
bool trimSpaces = fieldTypeInfo.TrimSpaces == null ? this.TrimSpaces : fieldTypeInfo.TrimSpaces.Value;
if (trimSpaces)
{
fields[i] = fields[i].Trim();
}
if (fields[i].Length == 0 && !allowNull)
{
throw new ParseException("Field is null", this.RecordNumber, fieldTypeInfo, rawData);
}
try
{
fieldValue = fieldTypeInfo.TypeConverter.ConvertFromString(fields[i]);
}
catch (Exception ex)
{
throw new ParseException("Could not convert field value", ex, this.RecordNumber, fieldTypeInfo, rawData);
}
fieldTypeInfo.FieldInfo.SetValueDirect(__makeref(record), fieldValue);
}
}
return record;
}
catch (ParseException ex)
{
ParseErrorAction action = (ex.FieldTypeInfo.ParseError == null) ? DefaultParseErrorAction : ex.FieldTypeInfo.ParseError.Value;
switch (action)
{
case ParseErrorAction.SkipRecord:
continue;
case ParseErrorAction.ThrowException:
throw;
case ParseErrorAction.RaiseEvent:
throw new NotImplementedException("Events are not yet available", ex);
default:
throw new NotImplementedException("Unknown ParseErrorAction", ex);
}
}
}
return null;
}
}
il aurait été plus facile de simplifier votre exemple ... Je –
commencé à le faire, mais il me semblait trop simplifié le rôle important que je suppose est la suivante:. fieldTypeInfo .FieldInfo.SetValueDirect (__ makeref (record), fieldValue); –
Le point est: sans l'exemple le plus simple, nous pouvons ' t reproduire ce que vous voyez ... donc un peu difficile de répondre avec confiance. –