سلاسل السيارات لتعداد أوصاف
-
27-09-2019 - |
سؤال
بالنظر إلى الشرط:
خذ رسم بياني كائن ، قم بتعيين جميع خصائص نوع التعداد بناءً على معالجة قيمة خاصية السلسلة الثانية. تملي الاتفاقية أن اسم خاصية سلسلة المصدر سيكون اسم خاصية ENUM مع postfix من "RAW".
من خلال المعالجة ، نعني أننا سنحتاج إلى تجريد الأحرف المحددة وما إلى ذلك
لقد نظرت إلى التنسيقات المخصصة ، وحفلات القيمة ومحولات الكتابة ، لا شيء يبدو وكأنه حل لهذا؟
نريد استخدام السيارات بدلاً من روتين الانعكاس الخاص بنا لسببين ، أ) يتم استخدامه على نطاق واسع خلال بقية المشروع و B) يمنحك OOTB العودية.
-- مثال --
بالنظر إلى الهيكل (البسيط) أدناه ، وهذا:
var tmp = new SimpleClass
{
CountryRaw = "United States",
Person = new Person { GenderRaw="Male" }
};
var tmp2 = new SimpleClass();
Mapper.Map(tmp, tmp2);
كنا نتوقع أن يكون التعداد MapPedCountry من TMP2 بلد.
public class SimpleClass1
{
public string CountryRaw {get;set;}
public Country MappedCountry {get;set;}
public Person Person {get;set;}
}
public class Person
{
public string GenderRaw {get;set;}
public Gender Gender {get;set;}
public string Surname {get;set;}
}
public enum Country
{
UnitedStates = 1,
NewZealand = 2
}
public enum Gender
{
Male,
Female,
Unknown
}
شكرًا
المحلول
لقد فعلت ذلك مع القيمة، هنا كل شيء:
لقد أضفت دعامة أخرى إلى SimpleClass فقط لأوضح لك كيف تعمل
public class SixFootUnderTest
{
[Test]
public void Test()
{
var o = new SimpleClass1
{
CountryRaw = "United States",
GenderRaw = "Female",
Person = new Person { GenderRaw = "Male" }
};
var oo = new SimpleClass1();
oo.InjectFrom(o)
.InjectFrom<StrRawToEnum>(o);
oo.Person.InjectFrom<StrRawToEnum>(o.Person);
oo.Country.IsEqualTo(Country.UnitedStates);
oo.Gender.IsEqualTo(Gender.Female);
oo.Person.Gender.IsEqualTo(Gender.Male);
}
public class SimpleClass1
{
public string CountryRaw { get; set; }
public Country Country { get; set; }
public string GenderRaw { get; set; }
public Gender Gender { get; set; }
public Person Person { get; set; }
}
public class Person
{
public string GenderRaw { get; set; }
public Gender Gender { get; set; }
public string Surname { get; set; }
}
public class StrRawToEnum : LoopValueInjection
{
protected override bool UseSourceProp(string sourcePropName)
{
return sourcePropName.EndsWith("Raw");
}
protected override string TargetPropName(string sourcePropName)
{
return sourcePropName.RemoveSuffix("Raw");
}
protected override bool TypesMatch(Type sourceType, Type targetType)
{
return sourceType == typeof(string) && targetType.IsEnum;
}
protected override object SetValue(object sourcePropertyValue)
{
return Enum.Parse(TargetPropType, sourcePropertyValue.ToString().Replace(" ", ""), true);
}
}
public enum Country
{
UnitedStates = 1,
NewZealand = 2
}
public enum Gender
{
Male,
Female,
Unknown
}
}
أيضًا في حال احتجت إلى القيام بذلك من CountryRaw إلى MedcedCountry ، يمكنك القيام بذلك على هذا النحو:
oo.InjectFrom(new StrRawToEnum().TargetPrefix("Mapped"), o);