我正在尝试创建一个Cacheable对象。我的问题是我想允许Cacheable对象直接将其转换为T.我试图显式/隐式地覆盖运算符但我仍然收到InvalidCastException。 这是我的Cacheable对象
public class Cacheable<T> : ICacheable<T>, IEquatable<T>
{
private Func<T> fetch;
private T value { get; set; }
public Cacheable(Func<T> fetch)
{
this.fetch = fetch;
}
public T Value
{
get
{
if (value == null) value = fetch();
return value;
}
}
public bool Equals(T other)
{
return other.Equals(Value);
}
public void Source(Func<T> fetch)
{
this.fetch = fetch;
}
public static implicit operator Cacheable<T>(Func<T> source)
{
return new Cacheable<T>(source);
}
public static explicit operator Func<T>(Cacheable<T> cacheable)
{
return cacheable.fetch;
}
public static explicit operator T(Cacheable<T> cacheable)
{
return cacheable.Value;
}
}
这是我尝试使用的代码
public class prog
{
public string sample()
{
var principal = new Cacheable<IPrincipal>(()=>{
var user = HttpContext.Current.User;
if (!user.Identity.IsAuthenticated) throw new UnauthorizedAccessException();
return user;
});
return ((IPrincipal)principal).Identity.Name; //this is where the error occur
}
}
错误信息:
类型&#39; System.InvalidCastException&#39;的例外情况发生在Connect.Service.dll中但未在用户代码中处理
附加信息:无法转换类型&#39; Common.Cacheable`1 [System.Security.Principal.IPrincipal]&#39;输入&#39; System.Security.Principal.IPrincipal&#39;。
答案 0 :(得分:2)
当两个值中的一个是接口时,Explicite转换不起作用,您可以在此处阅读:https://msdn.microsoft.com/en-us/library/aa664464(VS.71).aspx
为了让你的程序工作,你需要一个继承自IPrincipal的类,并像这样进行转换:
return ((YourPrincipal)principal).Identity.Name;
此链接向您展示如何创建自己的校长。