/// <summary> /// Constructs a FieldMask from the passed field numbers. /// </summary> /// <typeparam name="T">The type to validate the field paths against.</typeparam> public static FieldMask FromFieldNumbers <T>(IEnumerable <int> fieldNumbers) where T : IMessage { var descriptor = Activator.CreateInstance <T>().Descriptor; var mask = new FieldMask(); foreach (var fieldNumber in fieldNumbers) { var field = descriptor.FindFieldByNumber(fieldNumber); if (field == null) { throw new ArgumentNullException($"{fieldNumber} is not a valid field number for {descriptor.Name}"); } mask.Paths.Add(field.Name); } return(mask); }
/// <summary> /// Constructs a FieldMask for a list of field paths in a certain type. /// </summary> /// <typeparam name="T">The type to validate the field paths against.</typeparam> public static FieldMask FromStringEnumerable <T>(IEnumerable <string> paths) where T : IMessage { var mask = new FieldMask(); foreach (var path in paths) { if (path.Length == 0) { // Ignore empty field paths. continue; } if (typeof(T) != typeof(Empty) && !IsValid <T>(path)) { throw new InvalidProtocolBufferException(path + " is not a valid path for " + typeof(T)); } mask.Paths.Add(path); } return(mask); }
/// <summary> /// Checks whether paths in a given fields mask are valid. /// </summary> /// <typeparam name="T">The type to validate the field paths against.</typeparam> public static bool IsValid <T>(FieldMask fieldMask) where T : IMessage { var descriptor = Activator.CreateInstance <T>().Descriptor; return(IsValid(descriptor, fieldMask)); }