为泛型类型创建用户定义转换
本文关键字:定义 转换 用户 创建 泛型类型 | 更新日期: 2023-09-27 18:05:41
我正在尝试创建一个可缓存对象。我的问题是,我想允许可缓存对象直接转换为T.我试图覆盖操作符显式/隐式,但我仍然收到InvalidCastException。这是我的可缓存对象
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
}
}
错误信息:
类型为'System '的异常。在Connect.Service.dll中发生InvalidCastException,但未在用户代码中处理
附加信息:无法强制转换类型为'Common.Cacheable ' 1的对象[System.Security.Principal]。
当两个值中的一个是接口时,显式转换不工作。你可以在这里阅读:https://msdn.microsoft.com/en-us/library/aa664464(VS.71).aspx
要使你的程序工作,你需要一个继承自IPrincipal并像这样强制转换的类:
return ((YourPrincipal)principal).Identity.Name;
这个链接向您展示如何创建您自己的主体。
https://msdn.microsoft.com/en-us/library/ff649210.aspx