为通用类型创建用户定义的转换

时间:2015-07-30 04:47:57

标签: c# generics

我正在尝试创建一个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;。

1 个答案:

答案 0 :(得分:2)

当两个值中的一个是接口时,Explicite转换不起作用,您可以在此处阅读: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