Я работаю над требованием, когда мне нужно проверить свое свойство модели ASP.NET для значения 000000.Если значение 000000, то оно должно отображаться как пустая строка. Я думал об этом, используя неявные операторы. Вот моя модель классаC# Неявный оператор не работает с отражением
public class OrgName
{
private string Value { get; set; }
public static implicit operator string(OrgName org)
{
return org.Value;
}
public static implicit operator OrgName(string value)
{
bool isAllZeros = value.Where(x => char.IsDigit(x)).All(x => x == '0');
if (isAllZeros)
value = string.Empty;
return new OrgName() { Value = value };
}
}
Проблема заключается в том, что мы с помощью отражения, чтобы установить свойство values.The выше код не работает, и свойство всегда отображается как пустой.
Вот код отражения
var prName = (String.IsNullOrWhiteSpace(parentPrefix) ? objKey : parentPrefix + '.' + objKey);
var pi = modelMap[prName.ToLowerInvariant()].Property;
var value = (collectionProperties.ContainsKey(objKey)) ? collectionProperties[objKey] : pi.GetValue(parentObj);
if (value == null || pi.PropertyType.IsSimpleType())
{
value = (prName == fieldToSet && pi.PropertyType.IsSimpleType())
? (Convert.IsDBNull(valueToSet)) ? null : valueToSet
: createObject(pi.PropertyType);
var type = Nullable.GetUnderlyingType(pi.PropertyType);
//check to see if we need to convert the type when assigning
if (type == typeof(Guid))
value = Guid.Parse(value.ToString());
pi.SetValue(parentObj, type != null ? Convert.ChangeType(value, type) : value);
if (pi.PropertyType != typeof(string) && IsContainerProperty(pi.PropertyType))
continue;
if (pi.PropertyType == typeToReturn)
objToLoad = value;
}
else if (!collectionProperties.ContainsKey(objKey) && IsContainerProperty(pi.PropertyType))
{
var innerType = pi.PropertyType.GetGenericArguments()[0];
var add = pi.PropertyType.GetMethod("Add",
BindingFlags.Instance | BindingFlags.InvokeMethod | BindingFlags.Public);
if (innerType.IsSimpleType())
{
collectionProperties[objKey] = valueToSet;
add.Invoke(value, new[] { valueToSet });
}
else
{
// Since we can't access the property
var innerObj = createObject(innerType);
collectionProperties[objKey] = innerObj;
add.Invoke(value, new[] { innerObj });
if (innerType == typeToReturn)
objToLoad = innerObj;
continue;
}
}
Может кто-то помочь мне с этим? Я также открыт для других предложений для достижения этой цели.
Thanks
Я не вижу никакого отражения здесь. Можете ли вы добавить этот код? –
Ваш код имеет недостаток кстати. Строка 'a0000a0b0' будет обнаружена как' isAllZeros'. – Bauss
Я не понимаю, почему этот вопрос ниспровергнут. Я имею в виду, Приянк сделал некоторые исследования, предоставил код и так далее. Цели также четко описаны, хотя код и вопрос немного противоречат друг другу, но я не понимаю, почему это послужило бы причиной для понижения. – Heki