in src/Elastic.Clients.Elasticsearch/_Shared/Core/Infer/Id/IdResolver.cs [40:78]
public string Resolve<T>(T @object) =>
_elasticsearchClientSettings.DefaultDisableIdInference || @object == null
? null
: Resolve(@object.GetType(), @object);
public string Resolve(Type type, object @object)
{
if (type == null || @object == null)
return null;
if (_elasticsearchClientSettings.DefaultDisableIdInference ||
_elasticsearchClientSettings.DisableIdInference.Contains(type))
return null;
var preferLocal = _elasticsearchClientSettings.IdProperties.TryGetValue(type, out _);
if (_localIdDelegates.TryGetValue(type, out var cachedLookup))
return cachedLookup(@object);
if (!preferLocal && IdDelegates.TryGetValue(type, out cachedLookup))
return cachedLookup(@object);
var idProperty = GetInferredId(type);
if (idProperty == null)
return null;
var getMethod = idProperty.GetMethod;
var generic = MakeDelegateMethodInfo.MakeGenericMethod(type, getMethod.ReturnType);
var func = (Func<object, object>)generic.Invoke(null, new object[] {getMethod});
cachedLookup = o =>
{
var v = func(o);
return (v is IFormattable f) ? f.ToString(null, CultureInfo.InvariantCulture) : v?.ToString();
};
if (preferLocal)
_localIdDelegates.TryAdd(type, cachedLookup);
else
IdDelegates.TryAdd(type, cachedLookup);
return cachedLookup(@object);
}