具有两种可能类型的通用属性

时间:2012-09-20 09:08:51

标签: c# .net generics

我正在尝试创建一个公共属性,可以是longGuid类型。仿制药有可能吗?例如

之类的东西
public virtual T where T: long or Gui Id { get; set; }

5 个答案:

答案 0 :(得分:4)

  

是否可以使用泛型?

这是不可能的,但您可以使用implicit operator来支持longGuid,示例代码:

internal class YourId
{
    public long LongId { get; private set; }
     public Guid GuidId { get; private set; }

    public YourId(long longValue)
    {
        LongId = longValue;
    }

    public YourId(Guid guidValue)
    {
        GuidId = guidValue;
    }

    public static implicit operator long(YourId yourId)
    {
        return yourId.LongId;
    }

    public static  implicit operator YourId(long value)
    {
        return new YourId(value);
    }

       public static implicit operator Guid(YourId yourId)
    {
        return yourId.GuidId;
    }

    public static  implicit operator YourId(Guid value)
    {
        return new YourId(value);
    }
}

现在你可以使用:

YourId id1 = Guid.NewGuid();
YourId id2 = long.MaxValue;

答案 1 :(得分:1)

不,这是不可能的。如果你只有两种可能的类型,那么只需编写两次类,将尽可能多的公共代码放在一个公共基类中?

答案 2 :(得分:1)

不,那是不可能的。没有这样的限制。这是一个list of possible constraints

答案 3 :(得分:1)

不可能这不可能,你必须选择一个相同的父类,或者你应该编写一个可以存储它们的类的实现。

类似的东西:

class LongOrGuid
{
     private Guid _guid;
     private long _long;
     private bool _isGuid = true;

     public LongOrGuid(Guid g)
     {
          _guid = g;
          _isGuid = true;
     }

     public LongOrGuid(long l)
     {
          _long = l;
          _isGuid = false;
     }

     public long Long
     {
          get
          {
               if(_isGuid)
               {
                    throw new NotSupportedException("This is a guid");
               }
               return _long;
          }
     }

     public Guid Guid
     {
          get
          {
               if(!_isGuid)
               {
                    throw new NotSupportedException("This is a long");
               }
               return _guid;
          }
     }

     public bool IsGuid
     {
          get
          {
               return _isGuid;
          }
     }
}

答案 4 :(得分:1)

属性不能像那样通用。也许你可以让包含属性的类通用呢?

您不能限制为longGuid。你可以说:

class ClassContainingYourProperty<T> where T : struct, IFormattable, IComparable<T>, IEquatable<T>
{
  static ClassContainingYourProperty() // do type check in static constructor
  {
    var t = typeof(T);
    if (t != typeof(long) && t != typeof(Guid))
      throw new NotSupportedException("T cannot be " + t);
  }

  public virtual T YourProperty { get; set; }
}