【问题标题】:WCF: For which property type do I have to call SetLinkWCF:我必须为哪种属性类型调用 SetLink
【发布时间】:2016-05-24 15:26:58
【问题描述】:

我想创建一个真正通用的类来将对象保存到 WCF 服务。我得到任何类型的对象并通过反射分析对象属性。将对象保存到服务上下文时,我需要知道是否必须为属性调用DataServiceContextSetLink(...) 方法。

因此,我需要一种方法来找出是否必须致电SetLink(...)。我已经尝试过自己做:

private bool IsLinkedProperty(PropertyInfo propertyInfo)
{
    return (propertyInfo != null) && propertyInfo.PropertyType.IsClass;
}

但是这个函数不适用于字符串属性,也许也不适用于其他属性。有人有适合这个的功能吗?

【问题讨论】:

  • 你能定义判断方法是否应该被调用的标准吗?
  • 你可以在这里找到SetLink方法:link。据我了解,所有“原始”数据类型。
  • 在我看来,您需要将元数据(即属性)添加到您的属性中,以了解何时调用该方法以及为参数传递什么。

标签: c# wcf datacontext


【解决方案1】:

我最终得到了以下解决方案。我在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;
    }
}

用 NUnit 编写的测试用例有:

[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));
    }
}

最后我将问题中提到的方法更改为:

private bool IsLinkedProperty()
{ 
    return (_propertyInfo != null) && !_propertyInfo.PropertyType.IsSimple();
}

【讨论】:

    猜你喜欢
    • 2011-02-26
    • 2020-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多