ConditionalWeakTable<TKey,TValue>.CreateValueCallback 委托

定义

表示一种方法,用于创建作为键/值对的一部分添加到 ConditionalWeakTable<TKey,TValue> 对象的非默认值。

C#
public delegate TValue ConditionalWeakTable<TKey,TValue>.CreateValueCallback(TKey key) where TKey : class where TValue : class;

参数

key
TKey

属于要创建的值的键。

返回值

TValue

一个引用类型的实例,该类型表示要附加到指定键的值。

示例

以下示例定义 MainClass 类和 MainInfo 类。 MainInfo 提供有关实例的信息 MainClass 。 它还在 Visual Basic) 方法中定义静态 (Shared ,该静态 (CreateAttachedValue 可以分配给 ConditionalWeakTable<TKey,TValue>.CreateValueCallback 委托并传递给 GetValue 方法。 该示例调用 GetValue 方法以将 对象及其对应的 MainInfo 对象添加到MainClassConditionalWeakTable<TKey,TValue>表中。 该示例还演示了调用 AddGetOrCreateValue 方法以向表添加键/值对,以及调用 TryGetValue 方法以检索属于现有键的值。

C#
using System;
using System.Reflection;
using System.Runtime.CompilerServices;

public class Example
{
   string Name; 
   
   public Example(string name)
   {
      this.Name = name;
   }
   
   public override string ToString()
   {
      return this.Name;
   }
}

// Define a class to contain information about each Example instance.
public class ExampleInfo
{
   public string Name;
   public int Methods;
   public int Properties;
   
   public override string ToString()
   {
      return String.Format("{0}: {1} Methods, {2} Properties", 
                           this.Name, this.Methods, this.Properties);
   }
}

public class ExampleTest
{
   private static BindingFlags flags = BindingFlags.Public | BindingFlags.Instance;

   public static void Main()
   {
      Example ex1 = new Example("ex1");
      Example ex2 = new Example("ex2");
      Example ex3 = new Example("ex3");
      
      ExampleInfo exInfo1 = new ExampleInfo(); 
      exInfo1.Name = ex1.ToString();
      exInfo1.Methods = ex1.GetType().GetMethods(flags).Length;
      exInfo1.Properties = ex1.GetType().GetProperties(flags).Length;
      
      ExampleInfo exInfo3 = new ExampleInfo(); 
      exInfo3.Name = ex3.ToString();
      exInfo3.Methods = ex3.GetType().GetMethods(flags).Length;
      exInfo3.Properties = ex3.GetType().GetProperties(flags).Length;

      var attached = new ConditionalWeakTable<Example, ExampleInfo>();
      ExampleInfo value = null;

      // Attach a property to ex1 using the Add method, then retrieve it.
      attached.Add(ex1, exInfo1);
      if (attached.TryGetValue(ex1, out value))
         Console.WriteLine("{0}, {1}", ex1, value);
      else
         Console.WriteLine("{0} does not have an attached property.", ex1);

      // Attempt to retrieve the value attached to ex2.
      value = attached.GetValue(ex2, ExampleTest.CreateAttachedValue);      
      if (attached.TryGetValue(ex2, out value))
         Console.WriteLine("{0}, {1}", ex2, value);
      else 
         Console.WriteLine("{0} does not have an attached property.", ex2);
      
      // Attempt to retrieve the value attached to ex3.
      value = attached.GetOrCreateValue(ex3);
      Console.WriteLine("{0}, {1}", ex3, value);
   }

   public static ExampleInfo CreateAttachedValue(Example ex)
   {
      ExampleInfo info = new ExampleInfo();
      info.Name = ex.ToString();
      info.Methods = ex.GetType().GetMethods(flags).Length;
      info.Properties = ex.GetType().GetProperties(flags).Length;
      return info;
   }
}
// The example displays the following output:
//       ex1, ex1: 4 Methods, 0 Properties
//       ex2, ex2: 4 Methods, 0 Properties
//       ex3, : 0 Methods, 0 Properties

注解

委托 ConditionalWeakTable<TKey,TValue>.CreateValueCallback 封装在 对象中找不到传递给 方法的键时由 ConditionalWeakTable<TKey,TValue>.GetValue 方法调用的 ConditionalWeakTable<TKey,TValue> 回调方法。 方法 GetValue 向回调方法传递表示要动态附加属性值的托管对象的键。 方法负责将属性值返回到其调用方,后者又将键/值对添加到表中。

方法 ConditionalWeakTable<TKey,TValue>.CreateValueCallback 用于返回可附加到指定键的引用类型的实例。 它允许使用非默认值初始化该实例。 如果在表中找不到键,方法 ConditionalWeakTable<TKey,TValue>.GetOrCreateValue 会添加一个键/值对,其中使用默认值初始化值。

扩展方法

GetMethodInfo(Delegate)

获取指示指定委托表示的方法的对象。

适用于

产品 版本
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9, 10
.NET Framework 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 1.3, 1.4, 1.5, 1.6, 2.0, 2.1
UWP 10.0

另请参阅