Validate if either or both of two fields has been provided, as a ValidationAttribute
Fields and properties are different things. You are mixing them up: the naming in the attribute code suggests that you want to operate on fields, but the use site is supplying property names. The naming of field1 and field2 should be changed to propertyName1 and propertyName2 respectively.

Don't forget your BindingFlags! Right now your code will look up any public property with the given name, including static properties. You probably only want public instance properties:

var property1 = validationContext.ObjectType.GetProperty(_field1, BindingFlags.Instance | BindingFlags.Public);


Depending on your performance constraints, reflection might be too slow for you. If so, it's common practice to cache the results of calls to GetProperty since that information is unchanging at runtime.

It's good practice to use nameof for getting string representations of identifiers, because if SomeModel.A gets renamed then the program won't compile until you also update the attribute argument.

[EitherRequired(nameof(A), nameof(B))]
public class SomeModel
{
    public int? A {get; set;}
    public int? B {get; set;}
}