为泛型类型创建用户定义转换

本文关键字:定义 转换 用户 创建 泛型类型 | 更新日期: 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