BindingFlags 枚举的用法

 

None.gif 写这个想法:就是
None.gif    如果想比较一个enum类中的枚举项是否相同的话。
None.gif可以用下面的这个语句:
None.gifBindingFlags selectedBindingFlags 
=  (BindingFlags)Enum.Parse( typeof (BindingFlags),  this .comboBox1.SelectedValue.ToString(),  true );
None.gif
None.gif
*   public   enum  BindingFlags是枚举类
None.gif  ArrayList list
=   new  ArrayList()以下都是向 ComboBox控件中添加Item,Value。
None.gif
None.gif从comboBox中选择一项之后,如:选择Public项,然后通过上面这个语句,从BindingFlags类的去寻找相同的EnumItem,如果有的话,Return 
true ,没有也不会error


None.gif public   enum  BindingFlags 
ExpandedBlockStart.gifContractedBlock.gif    
dot.gif
InBlock.gif        Default 
= 0
InBlock.gif        IgnoreCase 
= 1
InBlock.gif        DeclaredOnly 
= 2
InBlock.gif        Instance 
= 4
InBlock.gif        Static 
= 8
InBlock.gif        Public 
= 16
InBlock.gif        NonPublic 
= 32
InBlock.gif        FlattenHierarchy 
= 64
InBlock.gif        InvokeMethod 
= 256
InBlock.gif        CreateInstance 
= 512
InBlock.gif        GetField 
= 1024
InBlock.gif        SetField 
= 2048
InBlock.gif        GetProperty 
= 4096
InBlock.gif        SetProperty 
= 8192
InBlock.gif        PutDispProperty 
= 16384
InBlock.gif        PutRefDispProperty 
= 32768
InBlock.gif        ExactBinding 
= 65536
InBlock.gif        SuppressChangeType 
= 131072
InBlock.gif        OptionalParamBinding 
= 262144
InBlock.gif        IgnoreReturn 
= 16777216
ExpandedBlockEnd.gif    }
 
None.gif
None.gif ArrayList list  =   new  ArrayList(); 
None.giflist.Add(
new  DictionaryEntry( " 0 " " Default " )); 
None.gif            list.Add(
new  DictionaryEntry( " 2 " " IgnoreCase " )); 
None.gif            list.Add(
new  DictionaryEntry( " 3 " " DeclaredOnly " )); 
None.gif            list.Add(
new  DictionaryEntry( " 4 " " Instance " )); 
None.gif            list.Add(
new  DictionaryEntry( " 8 " " Static " )); 
None.gif            list.Add(
new  DictionaryEntry( " 16 " " Public " )); 
None.gif            list.Add(
new  DictionaryEntry( " 32 " " NonPublic " )); 
None.gif            list.Add(
new  DictionaryEntry( " 64 " " FlattenHierarchy " )); 
None.gif            list.Add(
new  DictionaryEntry( " 256 " " InvokeMethod " )); 
None.gif            list.Add(
new  DictionaryEntry( " 512 " " CreateInstance " )); 
None.gif            list.Add(
new  DictionaryEntry( " 1024 " " GetField " )); 
None.gif            list.Add(
new  DictionaryEntry( " 2048 " " SetField " )); 
None.gif            list.Add(
new  DictionaryEntry( " 4096 " " GetProperty " )); 
None.gif            list.Add(
new  DictionaryEntry( " 8192 " " SetProperty " )); 
None.gif            list.Add(
new  DictionaryEntry( " 16384 " " PutDispProperty " )); 
None.gif            list.Add(
new  DictionaryEntry( " 32768 " " PutRefDispProperty " )); 
None.gif            list.Add(
new  DictionaryEntry( " 65536 " " ExactBinding " )); 
None.gif            list.Add(
new  DictionaryEntry( " 131072 " " SuppressChangeType " )); 
None.gif            list.Add(
new  DictionaryEntry( " 262144O " " ptionalParamBinding " )); 
None.gif            list.Add(
new  DictionaryEntry( " 16777216 " " IgnoreReturn " )); 
None.gif
None.gif            comboBox1.DataSource 
=  list; 
None.gif            comboBox1.DisplayMember 
=   " Value "
None.gif            comboBox1.ValueMember 
=   " Key "
None.gif
None.gif 最后贴一个BindingFlags的Demo Share with EveryOne
None.gif
-----------------------------------------------
None.gif
using  System;
None.gif
using  System.Reflection;
None.gif
using  System.IO;
None.gif
None.gif
namespace  BindingFlagsSnippet
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    
class EntryPoint
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        
static void Main(string[] args)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            Invoke.Go();
ExpandedSubBlockEnd.gif        }

ExpandedSubBlockEnd.gif    }

InBlock.gif
InBlock.gif    
InBlock.gif    
class Invoke
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        
public static void Go()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            
// BindingFlags.InvokeMethod
InBlock.gif            
// Call a static method.
InBlock.gif
            Type t = typeof (TestClass);
InBlock.gif
InBlock.gif            Console.WriteLine();
InBlock.gif            Console.WriteLine(
"Invoking a static method.");
InBlock.gif            Console.WriteLine(
"-------------------------");
ExpandedSubBlockStart.gifContractedSubBlock.gif            t.InvokeMember (
"SayHello", BindingFlags.InvokeMethod, nullnullnew object [] dot.gif{});
InBlock.gif
InBlock.gif            
// BindingFlags.InvokeMethod
InBlock.gif            
// Call an instance method.
InBlock.gif
            TestClass c = new TestClass ();
InBlock.gif            Console.WriteLine();
InBlock.gif            Console.WriteLine(
"Invoking an instance method.");
InBlock.gif            Console.WriteLine(
"----------------------------");
ExpandedSubBlockStart.gifContractedSubBlock.gif            c.GetType().InvokeMember (
"AddUp", BindingFlags.InvokeMethod, null, c, new object [] dot.gif{});
ExpandedSubBlockStart.gifContractedSubBlock.gif            c.GetType().InvokeMember (
"AddUp", BindingFlags.InvokeMethod, null, c, new object [] dot.gif{});
InBlock.gif            
InBlock.gif            
// BindingFlags.InvokeMethod
InBlock.gif            
// Call a method with parameters.
ExpandedSubBlockStart.gifContractedSubBlock.gif
            object [] args = new object [] dot.gif{100.09184.45};
InBlock.gif            
object result;
InBlock.gif            Console.WriteLine();
InBlock.gif            Console.WriteLine(
"Invoking a method with parameters.");
InBlock.gif            Console.WriteLine(
"---------------------------------");
InBlock.gif            result 
= t.InvokeMember ("ComputeSum", BindingFlags.InvokeMethod, nullnull, args);
InBlock.gif            Console.WriteLine (
"{0} + {1} = {2}", args[0], args[1], result);
InBlock.gif
InBlock.gif            
// BindingFlags.GetField, SetField
InBlock.gif
            Console.WriteLine();
InBlock.gif            Console.WriteLine(
"Invoking a field (getting and setting.)");
InBlock.gif            Console.WriteLine(
"--------------------------------------");
InBlock.gif            
// Get a field value.
ExpandedSubBlockStart.gifContractedSubBlock.gif
            result = t.InvokeMember ("Name", BindingFlags.GetField, null, c, new object [] dot.gif{});
InBlock.gif            Console.WriteLine (
"Name == {0}", result);
InBlock.gif            
// Set a field.
ExpandedSubBlockStart.gifContractedSubBlock.gif
            t.InvokeMember ("Name", BindingFlags.SetField, null, c, new object [] dot.gif{"NewName"});
ExpandedSubBlockStart.gifContractedSubBlock.gif            result 
= t.InvokeMember ("Name", BindingFlags.GetField, null, c, new object [] dot.gif{});
InBlock.gif            Console.WriteLine (
"Name == {0}", result);
InBlock.gif            
InBlock.gif            Console.WriteLine();
InBlock.gif            Console.WriteLine(
"Invoking an indexed property (getting and setting.)");
InBlock.gif            Console.WriteLine(
"--------------------------------------------------");
InBlock.gif            
// BindingFlags.GetProperty 
InBlock.gif            
// Get an indexed property value.
InBlock.gif
            int  index = 3;
ExpandedSubBlockStart.gifContractedSubBlock.gif            result 
= t.InvokeMember ("Item", BindingFlags.GetProperty, null, c, new object [] dot.gif{index});
InBlock.gif            Console.WriteLine (
"Item[{0}] == {1}", index, result);
InBlock.gif            
// BindingFlags.SetProperty
InBlock.gif            
// Set an indexed property value.
InBlock.gif
            index = 3;
ExpandedSubBlockStart.gifContractedSubBlock.gif            t.InvokeMember (
"Item", BindingFlags.SetProperty, null, c, new object [] dot.gif{index, "NewValue"});
ExpandedSubBlockStart.gifContractedSubBlock.gif            result 
= t.InvokeMember ("Item", BindingFlags.GetProperty , null, c, new object [] dot.gif{index});
InBlock.gif            Console.WriteLine (
"Item[{0}] == {1}", index, result);
InBlock.gif            
InBlock.gif            Console.WriteLine();
InBlock.gif            Console.WriteLine(
"Getting a field or property.");
InBlock.gif            Console.WriteLine(
"----------------------------");
InBlock.gif            
// BindingFlags.GetField
InBlock.gif            
// Get a field or property.
ExpandedSubBlockStart.gifContractedSubBlock.gif
            result = t.InvokeMember ("Name", BindingFlags.GetField | BindingFlags.GetProperty, null, c, new object [] dot.gif{});
InBlock.gif            Console.WriteLine (
"Name == {0}", result);
InBlock.gif            
// BindingFlags.GetProperty
ExpandedSubBlockStart.gifContractedSubBlock.gif
            result = t.InvokeMember ("Value", BindingFlags.GetField | BindingFlags.GetProperty, null, c, new object [] dot.gif{});
InBlock.gif            Console.WriteLine (
"Value == {0}", result);
InBlock.gif
InBlock.gif            Console.WriteLine();
InBlock.gif            Console.WriteLine(
"Invoking a method with named parameters.");
InBlock.gif            Console.WriteLine(
"---------------------------------------");
InBlock.gif            
// BindingFlags.InvokeMethod
InBlock.gif            
// Call a method using named parameters.
ExpandedSubBlockStart.gifContractedSubBlock.gif
            object[] argValues = new object [] dot.gif{"Mouse""Micky"};
ExpandedSubBlockStart.gifContractedSubBlock.gif            String [] argNames 
= new String [] dot.gif{"lastName""firstName"};
InBlock.gif            t.InvokeMember (
"PrintName", BindingFlags.InvokeMethod, nullnull, argValues, nullnull, argNames);
InBlock.gif
InBlock.gif            Console.WriteLine();
InBlock.gif            Console.WriteLine(
"Invoking a default member of a type.");
InBlock.gif            Console.WriteLine(
"------------------------------------");
InBlock.gif            
// BindingFlags.Default
InBlock.gif            
// Call the default member of a type.
InBlock.gif
            Type t3 = typeof (TestClass2);
ExpandedSubBlockStart.gifContractedSubBlock.gif            t3.InvokeMember (
"", BindingFlags.InvokeMethod | BindingFlags.Default, nullnew TestClass2(), new object [] dot.gif{});
InBlock.gif 
InBlock.gif            
// BindingFlags.Static, NonPublic, and Public
InBlock.gif            
// Invoking a member by reference.
InBlock.gif
            Console.WriteLine();
InBlock.gif            Console.WriteLine(
"Invoking a method by reference.");
InBlock.gif            Console.WriteLine(
"-------------------------------");
InBlock.gif            MethodInfo m 
= t.GetMethod("Swap");
InBlock.gif            args 
= new object[2];
InBlock.gif            args[
0= 1;
InBlock.gif            args[
1= 2;
InBlock.gif            m.Invoke(
new TestClass(),args);
InBlock.gif            Console.WriteLine (
"{0}, {1}", args[0], args[1]);
InBlock.gif            
// The string is case-sensitive.
InBlock.gif
            Type type = Type.GetType("System.String");
InBlock.gif
InBlock.gif            
// Check to see if the value is valid. If the object is null, the type does not exist.
InBlock.gif
            if (type == null
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                Console.WriteLine(
"Please ensure that you specify only valid types in the type field.");
InBlock.gif                Console.WriteLine(
"The type name is case-sensitive.");
InBlock.gif                
return;
ExpandedSubBlockEnd.gif            }

InBlock.gif            
// Declare and populate the arrays to hold the information.
InBlock.gif            
// You must declare either NonPublic or Public with Static or the search will not work.
InBlock.gif
            FieldInfo [] fi = type.GetFields (BindingFlags.Static |
InBlock.gif                BindingFlags.NonPublic 
| BindingFlags.Public);  
InBlock.gif            
// BindingFlags.NonPublic 
InBlock.gif
            MethodInfo [] miNonPublic = type.GetMethods (BindingFlags.Static |
InBlock.gif                BindingFlags.NonPublic);
InBlock.gif            
// BindingFlags.Public
InBlock.gif
            MethodInfo [] miPublic = type.GetMethods (BindingFlags.Static |
InBlock.gif                BindingFlags.Public);
InBlock.gif
InBlock.gif            
// Iterate through all the nonpublic methods.
InBlock.gif
            foreach (MethodInfo method in miNonPublic) 
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                Console.WriteLine(method);
ExpandedSubBlockEnd.gif            }

InBlock.gif            
// Iterate through all the public methods.
InBlock.gif
            foreach (MethodInfo method in miPublic) 
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                Console.WriteLine(method);
ExpandedSubBlockEnd.gif            }

InBlock.gif            
// Iterate through all the fields.
InBlock.gif
            foreach (FieldInfo f in fi) 
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                Console.WriteLine(f);
ExpandedSubBlockEnd.gif            }

InBlock.gif
InBlock.gif            
// BindingFlags.Instance
InBlock.gif            
// Call an instance method.
InBlock.gif
            TestClass tc = new TestClass ();
InBlock.gif            Console.WriteLine();
InBlock.gif            Console.WriteLine(
"Invoking an Instance method.");
InBlock.gif            Console.WriteLine(
"----------------------------");
InBlock.gif            tc.GetType().InvokeMember (
"AddUp", BindingFlags.Public | 
InBlock.gif                BindingFlags.Instance 
| BindingFlags.CreateInstance, 
ExpandedSubBlockStart.gifContractedSubBlock.gif                
null, tc, new object [] dot.gif{});
InBlock.gif
InBlock.gif            
// BindingFlags.CreateInstance
InBlock.gif            
// Calling and creating an instance method.
InBlock.gif
            Console.WriteLine();
InBlock.gif            Console.WriteLine(
"Invoking and creating an instance method.");
InBlock.gif            Console.WriteLine(
"-----------------------------------------");
InBlock.gif            tc.GetType().InvokeMember (
"AddUp", BindingFlags.Public | 
InBlock.gif                BindingFlags.Instance 
| BindingFlags.CreateInstance, 
ExpandedSubBlockStart.gifContractedSubBlock.gif                
null, tc, new object [] dot.gif{});
InBlock.gif
InBlock.gif            
// BindingFlags.DeclaredOnly
InBlock.gif
            TestClass tc2 = new TestClass();
InBlock.gif            Console.WriteLine();
InBlock.gif            Console.WriteLine(
"DeclaredOnly members");
InBlock.gif            Console.WriteLine(
"---------------------------------");
InBlock.gif            System.Reflection.MemberInfo[] memInfo 
= 
InBlock.gif                tc2.GetType().GetMembers(BindingFlags.DeclaredOnly);
InBlock.gif            
for(int i=0;i<memInfo.Length;i++
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                Console.WriteLine(memInfo[i].Name);
ExpandedSubBlockEnd.gif            }

InBlock.gif
InBlock.gif            
// BindingFlags.SuppressChangeType
InBlock.gif
            TestClass obj = new TestClass();
InBlock.gif            Console.WriteLine();
InBlock.gif            Console.WriteLine(
"Invoking static method - PrintName");
InBlock.gif            Console.WriteLine(
"---------------------------------");
InBlock.gif            System.Reflection.MethodInfo methInfo 
= 
InBlock.gif                obj.GetType().GetMethod(
"PrintName");
InBlock.gif            methInfo.Invoke(obj,BindingFlags.SuppressChangeType 
| 
InBlock.gif                BindingFlags.InvokeMethod, 
null,new object[] 
ExpandedSubBlockStart.gifContractedSubBlock.gif                
dot.gif{"Brad","Smith"},null);
InBlock.gif
InBlock.gif            
// BindingFlags.IgnoreCase
InBlock.gif
            Console.WriteLine();
InBlock.gif            Console.WriteLine(
"Using IgnoreCase and invoking the PrintName method.");
InBlock.gif            Console.WriteLine(
"---------------------------------------------------");
InBlock.gif            methInfo 
= obj.GetType().GetMethod("PrintName");
InBlock.gif            methInfo.Invoke(obj,BindingFlags.IgnoreCase 
| 
InBlock.gif                BindingFlags.InvokeMethod, 
null,new object[] 
ExpandedSubBlockStart.gifContractedSubBlock.gif                
dot.gif{"brad","smith"},null);
InBlock.gif
InBlock.gif            
// BindingFlags.IgnoreReturn
InBlock.gif
            Console.WriteLine();
InBlock.gif            Console.WriteLine(
"Using IgnoreReturn and invoking the PrintName method.");
InBlock.gif            Console.WriteLine(
"-----------------------------------------------------");
InBlock.gif            methInfo 
= obj.GetType().GetMethod("PrintName");
InBlock.gif            methInfo.Invoke(obj,BindingFlags.IgnoreReturn 
| 
InBlock.gif                BindingFlags.InvokeMethod, 
null,new object[] 
ExpandedSubBlockStart.gifContractedSubBlock.gif                
dot.gif{"Brad","Smith"},null);
InBlock.gif
InBlock.gif            
// BindingFlags.OptionalParamBinding
InBlock.gif
            Console.WriteLine();
InBlock.gif            Console.WriteLine(
"Using OptionalParamBinding and invoking the PrintName method.");
InBlock.gif            Console.WriteLine(
"-------------------------------------------------------------");
InBlock.gif            methInfo 
= obj.GetType().GetMethod("PrintName");
InBlock.gif            methInfo.Invoke(obj,BindingFlags.OptionalParamBinding 
| 
InBlock.gif                BindingFlags.InvokeMethod, 
null,new object[] 
ExpandedSubBlockStart.gifContractedSubBlock.gif                
dot.gif{"Brad","Smith"},null);
InBlock.gif
InBlock.gif            
// BindingFlags.ExactBinding
InBlock.gif
            Console.WriteLine();
InBlock.gif            Console.WriteLine(
"Using ExactBinding and invoking the PrintName method.");
InBlock.gif            Console.WriteLine(
"-----------------------------------------------------");
InBlock.gif            methInfo 
= obj.GetType().GetMethod("PrintName");
InBlock.gif            methInfo.Invoke(obj,BindingFlags.ExactBinding 
| 
InBlock.gif                BindingFlags.InvokeMethod, 
null,new object[] 
ExpandedSubBlockStart.gifContractedSubBlock.gif                
dot.gif{"Brad","Smith"},null);
InBlock.gif 
InBlock.gif            
// BindingFlags.FlattenHierarchy
InBlock.gif
            Console.WriteLine();
InBlock.gif            Console.WriteLine(
"Using FlattenHierarchy and invoking the PrintName method.");
InBlock.gif            Console.WriteLine(
"---------------------------------------------------------");
InBlock.gif            methInfo 
= obj.GetType().GetMethod("PrintName");
InBlock.gif            methInfo.Invoke(obj,BindingFlags.FlattenHierarchy 
| 
InBlock.gif                BindingFlags.InvokeMethod, 
null,new object[] 
ExpandedSubBlockStart.gifContractedSubBlock.gif                
dot.gif{"Brad","Smith"},null);
ExpandedSubBlockEnd.gif        }

ExpandedSubBlockEnd.gif    }

InBlock.gif
InBlock.gif    
public class TestClass
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        
public String Name;
ExpandedSubBlockStart.gifContractedSubBlock.gif        
private Object [] values = new Object [] dot.gif{01,2,3,4,5,6,7,8,9};
InBlock.gif
InBlock.gif        
public Object this [int index]
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            
get 
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                
return values[index];
ExpandedSubBlockEnd.gif            }

InBlock.gif            
set 
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                values[index] 
= value;
ExpandedSubBlockEnd.gif            }

ExpandedSubBlockEnd.gif        }

InBlock.gif
InBlock.gif        
public Object Value 
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            
get
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                
return "the value";
ExpandedSubBlockEnd.gif            }

ExpandedSubBlockEnd.gif        }

InBlock.gif
InBlock.gif        
public TestClass ()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            Name 
= "initialName";
ExpandedSubBlockEnd.gif        }

InBlock.gif
InBlock.gif        
int methodCalled = 0;
InBlock.gif
InBlock.gif        
public static void SayHello ()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            Console.WriteLine (
"Hello");
ExpandedSubBlockEnd.gif        }

InBlock.gif
InBlock.gif        
public void AddUp ()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            methodCalled
++;
InBlock.gif            Console.WriteLine (
"AddUp Called {0} times", methodCalled);
ExpandedSubBlockEnd.gif        }

InBlock.gif
InBlock.gif        
public static double ComputeSum (double d1, double d2)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            
return d1 + d2;
ExpandedSubBlockEnd.gif        }

InBlock.gif
InBlock.gif        
public static void PrintName (String firstName, String lastName)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            Console.WriteLine (
"{0},{1}", lastName,firstName);
ExpandedSubBlockEnd.gif        }

InBlock.gif
InBlock.gif        
public void PrintTime ()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            Console.WriteLine (DateTime.Now);
ExpandedSubBlockEnd.gif        }

InBlock.gif
InBlock.gif        
public void Swap(ref int a, ref int b)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            
int x = a;
InBlock.gif            a 
= b;
InBlock.gif            b 
= x;
ExpandedSubBlockEnd.gif        }

ExpandedSubBlockEnd.gif    }

InBlock.gif
InBlock.gif    [DefaultMemberAttribute (
"PrintTime")]
InBlock.gif    
public class TestClass2
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        
public void PrintTime ()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            Console.WriteLine (DateTime.Now);
ExpandedSubBlockEnd.gif        }

ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值