将布尔方法添加到现有类C#的最佳方法

时间:2015-07-17 16:47:11

标签: c# class methods

我确定这是一项非常简单的任务,但我并不完全确定如何将其写入搜索查询。我得到的最好的是扩展方法,我无法理解它们或者语法正确。

我目前正在使用一个简化为GTA V制作mod的程序集。这些程序集包括一个Ped"类型"有一堆附加到它的方法。

我正在寻找的是能够添加我自己的方法,该方法可以将bool值存储为Ped类的扩展。

Example

非常感谢任何帮助,谢谢。

2 个答案:

答案 0 :(得分:4)

您可以使用ConditionalWeakTable执行此任务:

  

ConditionalWeakTable<TKey, TValue>对象是一个字典,它将一个由密钥表示的托管对象绑定到其附加属性,该属性由值表示。对象的键是附加属性的TKey类的各个实例,其值是分配给相应对象的属性值。

示例:

public static class PedExtensions
{
    private static readonly ConditionalWeakTable<Ped, PedProperties> _props = new ConditionalWeakTable<Ped, PedProperties>();

    public static bool GetMyBool(this Ped ped)
    {
        return _props.GetOrCreateValue(ped).MyBool;
    }

    public static void SetMyBool(this Ped ped, bool value)
    {
        _props.GetOrCreateValue(ped).MyBool = value;
    }

    private class PedProperties
    {
        public bool MyBool { get; set; }
    }
}

(当然,如果您有许多要存储的属性,您可以将PedProperties作为公共顶级类并直接公开它。

由于表使用弱引用,因此您不必担心内存泄漏:

  

ConditionalWeakTable<TKey, TValue>类在管理集合中存储的键的对象生存期时与其他集合对象不同。通常,当一个对象存储在一个集合中时,它的生命周期一直持续到它被移除(并且没有对该对象的附加引用)或者直到集合对象本身被销毁为止。但是,在ConditionalWeakTable<TKey, TValue>类中,向表中添加键/值对并不能确保键保持,即使可以直接从表中存储的值到达它(例如,如果表包含一个键A,值为V1,第二个键B,其值为P2,其中包含对A的引用ConditionalWeakTable<TKey, TValue>)。相反,import csv from datetime import datetime import random f=open("gh.csv","w") csv.reader(f) g=open("gh.csv","a") k=csv.writer(g) k.writerow(("age","ageband","gender","disease")) for i in range(10): k.writerow((random.choice((range(0,100))),'40-50',random.choice(['male','female']),random.choice(['heartstroke','breastcancer','hypertension','hive']))) for col in f: age=row[2] if 40<=age>=55: print '40-55' elif 56<=age>=75: print '56-75' elif 76<=age>=100: print '76-100' else : print 'age>20' f.close() age ageband gender disease 62 40-50 female breastcancer 15 40-50 female breastcancer 6 40-50 male breastcancer 59 40-50 male heartstroke 64 40-50 female breastcancer 98 40-50 female breastcancer 51 40-50 female heartstroke 95 40-50 male heartstroke 27 40-50 male breastcancer 31 40-50 male hypertension 会在表外没有其他对键的引用时自动删除键/值条目。

答案 1 :(得分:0)

正确答案是你已经给出的答案,扩展方法。

public static class PedExtensions
{
    public static bool CheckIfTrue(this Ped ped)
    {
         if(ped.something != "this value")
         {
              return true;
         }

         return false;
    }
}

&#34; this&#34;在方法签名中引用代码附加到的东西。所以var myPed = new Ped(); myPed.CheckIfTrue();将在扩展名中运行代码。