【发布时间】:2014-11-22 03:14:07
【问题描述】:
我想创建一个在概念上类似于Nullable<T> 的Validatable<T> 类。我有一个许多类型使用的IValidatable 接口,但是如果一个类型还没有实现这个接口,我想很容易地在它周围放置一个包装器,然后使用该包装器来存储验证错误。
我希望能够转换回被包装的对象,但是即使我有一个显式的运算符集(虽然实际上我更喜欢一个隐式的运算符),这个转换还是失败了。以下是定义:
public interface IValidatable
{
bool IsValid { get; }
void Validate();
// (more validation-related methods here...)
}
public class Validatable<T> : IValidatable
where T : class
{
public Validatable(T obj)
{
Object = obj;
}
public T Object { get; private set; }
public bool IsValid { get; set; }
public void Validate()
{
}
public static implicit operator Validatable<T>(T other)
{
return new Validatable<T>(other);
}
public static explicit operator T(Validatable<T> other)
{
return other.Object;
}
}
public static class Validatable
{
public static IValidatable AsValidatable<T>(T obj)
where T: class
{
if (obj == null)
return null;
var already = obj as IValidatable;
return already ?? new Validatable<T>(obj);
}
}
public class Person // not IValidatable
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
但是如果我尝试:
public void ConversionTest()
{
var person = new Person { FirstName = "Bob", LastName = "Smith" };
var validatable = Validatable.AsValidatable(person);
var cast = (Person)validatable; // FAILS here with InvalidCastException
}
为什么会因 InvalidCastException 回退到 Person 失败?
【问题讨论】:
-
我会投票支持保持开放,因为这个问题还涉及 Nullable
如何支持这一点。 -
@erikkallen:
Nullable不是语言规范/编译器中的特例吗? -
@AndreyAkinshin 我查看了这个问题和许多其他处理泛型类型转换的问题,但我不相信他们中的任何一个都处理这个问题,因为
IValidatable接口的使用似乎是什么把我绊倒了。 -
你不能在Validatable上暴露原始对象吗?类似
validatable.GetUnderlying<Person>()