Target
using Org.BouncyCastle.Utilities;
using System;
namespace Org.BouncyCastle.Asn1.X509
{
    public class Target : Asn1Encodable, IAsn1Choice
    {
        public enum Choice
        {
            Name,
            Group
        }
        private readonly GeneralName targetName;
        private readonly GeneralName targetGroup;
        public virtual GeneralName TargetGroup => targetGroup;
        public virtual GeneralName TargetName => targetName;
        public static Target GetInstance(object obj)
        {
            Target target = obj as Target;
            if (target != null)
                return target;
            Asn1TaggedObject asn1TaggedObject = obj as Asn1TaggedObject;
            if (asn1TaggedObject != null)
                return new Target(asn1TaggedObject);
            throw new ArgumentException("unknown object in factory: " + Platform.GetTypeName(obj), "obj");
        }
        private Target(Asn1TaggedObject tagObj)
        {
            switch (tagObj.TagNo) {
            case 0:
                targetName = GeneralName.GetInstance(tagObj, true);
                break;
            case 1:
                targetGroup = GeneralName.GetInstance(tagObj, true);
                break;
            default:
                throw new ArgumentException("unknown tag: " + tagObj.TagNo.ToString());
            }
        }
        public Target(Choice type, GeneralName name)
            : this(new DerTaggedObject((int)type, name))
        {
        }
        public override Asn1Object ToAsn1Object()
        {
            if (targetName != null)
                return new DerTaggedObject(true, 0, targetName);
            return new DerTaggedObject(true, 1, targetGroup);
        }
    }
}