1

我正在尝试创建一个公共属性,它可以是 typelongGuid. 泛型可以吗?例如类似的东西

public virtual T where T: long or Gui Id { get; set; }
4

5 回答 5

4

泛型可以吗?

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

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;
于 2012-09-20T09:23:14.993 回答
1

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

于 2012-09-20T09:10:35.667 回答
1

不,那是不可能的。没有这样的约束。这是可能的约束列表

于 2012-09-20T09:10:38.950 回答
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;
          }
     }
}
于 2012-09-20T09:10:39.607 回答
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; }
}
于 2012-09-20T09:37:01.373 回答