Ich endete mit der folgenden Lösung. Ich fand einen Hinweis in der qestion of Nathan Ridley:
/// <summary>
/// Helper class for analyzing a type.
/// </summary>
public static class TypeAnalyzer
{
/// <summary>
/// Calculates if the given type is a "simple" type.
/// </summary>
/// <param name="type">Type to be checked for simplicity.</param>
/// <returns>True, if the type is "simple";false otherwise.</returns>
/// <remarks>
/// The following types are assumed to be simple:
/// <list type="*">
/// <item>string</item>
/// <item>int</item>
/// <item>decimal</item>
/// <item>float</item>
/// <item><see cref="StringComparison"/> (enum type)</item>
/// <item>int? (nullable simple types)</item>
/// </list>
/// The following types are not simple:
/// <list type="*">
/// <item>Point (struct)</item>
/// <item>Point? (nullable struct)</item>
/// <item>StringBuilder (class)</item>
/// </list>
/// </remarks>
public static bool IsSimple(this Type type)
{
if (IsNullableType(type))
return IsNestedTypeSimple(type);
return type.IsPrimitive
|| type.IsEnum
|| type.Equals(typeof(string))
|| type.Equals(typeof(decimal))
|| type.Equals(typeof(DateTime))
|| type.Equals(typeof(Guid));
}
private static bool IsNestedTypeSimple(Type type)
{
var nestedType = Nullable.GetUnderlyingType(type);
return IsSimple(nestedType);
}
private static bool IsNullableType(Type type)
{
return Nullable.GetUnderlyingType(type) != null;
}
}
Testfälle geschrieben in NUnit sind:
[TestFixture]
public class TypeAnalyzerTests
{
[TestCase(typeof(string), true)]
[TestCase(typeof(int), true)]
[TestCase(typeof(decimal), true)]
[TestCase(typeof(float), true)]
[TestCase(typeof(StringComparison), true)]
[TestCase(typeof(int?), true)]
[TestCase(typeof(decimal?), true)]
[TestCase(typeof(StringComparison?), true)]
[TestCase(typeof(object), false)]
[TestCase(typeof(Point), false)]
[TestCase(typeof(Point?), false)]
[TestCase(typeof(StringBuilder), false)]
[TestCase(typeof(DateTime), true)]
[TestCase(typeof(Guid), true)]
[TestCase(typeof(Guid?), true)]
public void IsSimple_WhenCalledForType_ReturnsExpectedResult(Type type, bool expectedResult)
{
var isSimple = TypeAnalyzer.IsSimple(type);
Assert.That(isSimple, Is.EqualTo(expectedResult));
}
}
Schließlich änderte ich die in der Anfrage genannten Methode:
private bool IsLinkedProperty()
{
return (_propertyInfo != null) && !_propertyInfo.PropertyType.IsSimple();
}
Können Sie die definieren Kriterien für die Bestimmung, ob die Methode aufgerufen werden soll? – stuartd
Sie finden die 'SetLink' Methode hier: [link] (https://msdn.microsoft.com/en-us/library/system.data.services.client.dataservicecontext.setlink%28v=vs.113%29 .aspx). Wie ich für alle "primitiven" Datentypen verstehe. – scher
Es sieht so aus, als müssten Sie Ihren Eigenschaften Metadaten (dh Attribute) hinzufügen, um zu wissen, wann die Methode aufgerufen werden muss und was für die Parameter übergeben werden soll. – stuartd